7

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

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

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

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

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

4

5 回答 5

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

和调用示例:

DbComputerSet cs = new DbComputerSet();
cs.Method<DbComputerSet, string>(set => set.Code);
于 2010-11-09T10:08:07.350 回答
9

您可以使用反射,您可以获取 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);
于 2008-09-21T09:22:02.537 回答
3

属性只是方法的语法糖。

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

但是,您可以创建一个方法 GetPropertyValue() 并将其作为委托传递。

于 2008-09-21T08:50:56.073 回答
2

@Dror 助手,

恐怕你不能那样做。编译器生成 get_PropertyName 和 set_PropertyName 方法,但不使用反射就无法访问它们。IMO 你能做的最好的事情是创建接受System.Reflection.ProperyInfoSystem.Object参数并返回 propInfo.GetValue(obj, null);的函数。

于 2008-09-21T09:11:25.713 回答
1

回复:阿库的回答:

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

于 2008-09-21T09:32:34.337 回答