当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将通用属性作为参数传递给函数?》经验,为你挑选了2个好方法。

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

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

delegate RET FunctionDelegate(T t);

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

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



1> Bartosz Pier..:

你也可以这样写:

static void Method(this T obj, Expression> 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(set => set.Code);



2> Nir..:

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

void func(FunctionDelegate function, T param, ...)
{
    ...
    return function(param);
}

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

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

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有