繁体   English   中英

如何将通用属性作为参数传递给函数?

[英]How to pass a generic property as a parameter to a function?

我需要编写一个函数,它接收一个属性作为参数并执行它的getter。

如果我需要传递函数/委托,我会使用:

delegate RET FunctionDelegate<T, RET>(T t);

void func<T, RET>(FunctionDelegate function, T param, ...)
{
    ...
    return function.Invoke(param);
}

是否有类似的方法来定义属性,以便我可以在函数代码中调用它的getter和/或setter?

你也可以这样写:

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);
        }

和调用的例子:

DbComputerSet cs = new DbComputerSet();
cs.Method<DbComputerSet, string>(set => set.Code);

您可以使用反射,您可以获取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);
}

对于类型为int的名为Foo的属性,它是SomeClass类的一部分:

SomeClass obj = new SomeClass();
func<SomeClass,int>(delegate(SomeClass o){return o.Foo;},obj);

属性只是方法的语法糖。

我不认为你可以修改一个属性,使它成为一个“你可以调用它的getter”的实体。

但是,您可以创建一个方法GetPropertyValue()并将其传递,就像它是委托一样。

@Dror Helper,

我担心你不能这样做。 编译器生成get_PropertyName和set_PropertyName方法,但如果不使用Reflection,则无法访问它们。 你可以做的最好的IMO是创建函数,它接受System.Reflection.ProperyInfoSystem.Object参数并返回propInfo.GetValue(obj,null);

回复:aku的回答:

然后你必须先获得该属性信息。 似乎“使用反射”是较难的C#问题的标准答案,但反射产生的代码并不那么难以维护。 Dror,为什么不创建一个为您读取属性的委托? 这是一个简单的单行程,可能是解决您问题的最快,最漂亮的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM