获取T的属性

时间:2016-01-14 09:43:20

标签: c# .net lambda expression

我想创建一些class<T>,然后在其中一个T对象(&#34; model&#34;)通过的方法中,我需要访问model.Property1和{ {1}}

我需要传递给类构造函数来访问属性的表达式是什么?

我想的是:

model.Property2

但在这里我只找到了如何使用MemberInfo获取属性名称(我还需要):

public MyClass(Expression<Func<T, object>> prop1, Expression<Func<T, object>> prop2)

如何访问属性本身? 像void MyMethod(T model, ...) { Console.WriteLine(prop1.Member.Name) }

这样的东西

3 个答案:

答案 0 :(得分:0)

如果使用以下内容为对象创建泛型类:

class MyClass<T, U>
    where T : class
    where U : struct
{ }

您可以创建一个界面,让您可以访问属性:

class IModel{
    public int id {get; set;}
}
class MyClass<T, U>
    where T : IModel
    where U : struct
{ }

然后当您在代码中引用T时,您可以从模型中访问id,如下所示:

    class MyClass<T, U>
        where T : IModel
        where U : struct
    { 
        public void DoStuff(T myModel){
            int a = myModel.id;
        }
    }

答案 1 :(得分:0)

表达式无法直接执行。为此,您需要将Expression<Func<..>>传递给Func<..>,这是通过Compile方法实现的,如此

void MyMethod(T model, ...)
{
    var prop1Value1 = prop1.Compile()(model);
}

出于性能原因,您可以考虑在类构造函数中编译表达式,并将结果委托存储在类字段中。

此外,如果您只需要获取值,则可以考虑更改结构签名以接受Func<..>而不是

public MyClass(Func<T, object> prop1, Func<T, object> prop2)

答案 2 :(得分:0)

如前所述,要么使用Generics(最好),要么使用反射(更慢,更少保存)

object p1 = model.GetType().GetProperty("Property1").GetValue(model)

你也可以滥用动态(脏!),因为它基本上与反射

相同
dynamic d = model; 
object p1 = d.Property1;