リフレクションを使用して、get/set アクセサーの MethodInfo オブジェクトを取得し、その Invoke メソッドを呼び出すことができます。
コード例では、get アクセサーと set アクセサーの両方があることを前提としており、これを運用コードで使用する場合は、実際にエラー処理を追加する必要があります。
たとえば、オブジェクト obj のプロパティ Foo の値を取得するには、次のように記述できます。
value = obj.GetType().GetProperty("Foo").GetAccessors()[0].Invoke(obj,null);
設定するには:
obj.GetType().GetProperty("Foo").GetAccessors()[1].Invoke(obj,new object[]{value});
したがって、obj.GetType().GetProperty("Foo").GetAccessors()[0] をメソッドに渡して、Invoke メソッドを実行できます。
より簡単な方法は、匿名メソッドを使用することです (これは .net 2.0 以降で機能します)。コード例を少し変更したバージョンを使用しましょう。
delegate RET FunctionDelegate<T, RET>(T t);
void func<T, RET>(FunctionDelegate<T,RET> function, T param, ...)
{
...
return function(param);
}
クラス SomeClass の一部である int 型の Foo という名前のプロパティの場合:
SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);