プロパティについてはGetGetMethod
、次のGetSetMethod
ことができます。
Getter = (Func<S, T>)Delegate.CreateDelegate(typeof(Func<S, T>),
propertyInfo.GetGetMethod());
と
Setter = (Action<S, T>)Delegate.CreateDelegate(typeof(Action<S, T>),
propertyInfo.GetSetMethod());
しかし、どうすればFieldInfo
sについて行くことができますか?
GetValue
andへのデリゲートを探しているわけではありませんSetValue
(つまり、毎回リフレクションを呼び出すことになります)。
Getter = s => (T)fieldInfo.GetValue(s);
Setter = (s, t) => (T)fieldInfo.SetValue(s, t);
しかし、CreateDelegate
ここにアプローチがあるとしたら?つまり、割り当ては値を返すので、割り当てをメソッドのように扱うことはできますか? もしそうなら、それのためのMethodInfo
ハンドルはありますか?つまり、メンバー フィールドから値を設定および取得する権利をメソッドに渡して、フィールドを直接読み書きできるデリゲートを取得するにはどうすればよいでしょうか。MethodInfo
CreateDelegate
Getter = (Func<S, T>)Delegate.CreateDelegate(typeof(Func<S, T>), fieldInfo.??);
Setter = (Action<S, T>)Delegate.CreateDelegate(typeof(Action<S, T>), fieldInfo.??);
式を作成してコンパイルすることはできますが、もっと単純なものを探しています。最後に、以下に示すように、尋ねられた質問に対する回答がない場合、式ルートに進んでもかまいません。
var instExp = Expression.Parameter(typeof(S));
var fieldExp = Expression.Field(instExp, fieldInfo);
Getter = Expression.Lambda<Func<S, T>>(fieldExp, instExp).Compile();
if (!fieldInfo.IsInitOnly)
{
var valueExp = Expression.Parameter(typeof(T));
Setter = Expression.Lambda<Action<S, T>>(Expression.Assign(fieldExp, valueExp), instExp, valueExp).Compile();
}
それとも存在しないものを求めているのでしょうか (そのようなものはまだどこにも見たことがありません) ?