您可以使用反射,您可以获取 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);
}
对于一个名为 Foo 的 int 类型的属性,它是 SomeClass 类的一部分:
SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);