あるオブジェクトのプロパティを文字列で指定して呼び出す

あるオブジェクトのプロパティを文字列で指定して呼び出す拡張メソッド。

public static dynamic GetDynamicMember<T1>(this T1 target, string memberName)
{
    if (target == null)
    {
        throw new NullReferenceException();
    }
    var binder = Binder.GetMember(CSharpBinderFlags.None, memberName, typeof(T1),
        new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) });
    var callsite = CallSite<Func<CallSite, object, object>>.Create(binder);

    return callsite.Target(callsite, target);
}

public static void SetDynamicMember<T1, T2>(this T1 target, string memberName, T2 value)
{
    var binder = Binder.SetMember(CSharpBinderFlags.None, memberName, typeof(T1),
        new[] { CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null),
                CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)
        });

    var callsite = CallSite<Func<CallSite, object, object, object>>.Create(binder);

    callsite.Target(callsite, target, value);
}

javascript likeな感じで利用

public string this[string name] {
    get { return this.GetDynamicMember(name); }
    set { this.SetDynamicMember(name,value); }
}

Setterは推論で型指定できるけどGetterはできないのでdynamic
dynamicなのはキャストがうざいから