我需要编写一个函数,它接收一个属性作为参数并执行它的getter.
如果我需要传递一个函数/委托,我会使用:
delegate RET FunctionDelegate<T, RET>(T t);
void func<T, RET>(FunctionDelegate function, T param, ...)
{
...
return function.Invoke(param);
}
Run Code Online (Sandbox Code Playgroud)
是否有类似的方法来定义属性,以便我可以在函数代码中调用它的getter和/或setter?
Bar*_*icz 11
你也可以这样写:
static void Method<T, U>(this T obj, Expression<Func<T, U>> property)
{
var memberExpression = property.Body as MemberExpression;
//getter
U code = (U)obj.GetType().GetProperty(memberExpression.Member.Name).GetValue(obj, null);
//setter
obj.GetType().GetProperty(memberExpression.Member.Name).SetValue(obj, code, null);
}
Run Code Online (Sandbox Code Playgroud)
和调用的例子:
DbComputerSet cs = new DbComputerSet();
cs.Method<DbComputerSet, string>(set => set.Code);
Run Code Online (Sandbox Code Playgroud)
您可以使用反射,您可以获取get/set访问器的MethodInfo对象并调用它的Invoke方法.
代码示例假设您同时拥有get和set访问器,如果要在生产代码中使用它,则必须添加错误处理:
例如,要获取对象obj的属性Foo的值,您可以编写:
value = obj.GetType().GetProperty("Foo").GetAccessors()[0].Invoke(obj,null);
Run Code Online (Sandbox Code Playgroud)
设置它:
obj.GetType().GetProperty("Foo").GetAccessors()[1].Invoke(obj,new object[]{value});
Run Code Online (Sandbox Code Playgroud)
因此,您可以将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);
}
Run Code Online (Sandbox Code Playgroud)
对于类型为int的名为Foo的属性,它是SomeClass类的一部分:
SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);
Run Code Online (Sandbox Code Playgroud)