C# 获取T的属性

C# 获取T的属性,c#,.net,lambda,expression,C#,.net,Lambda,Expression,我想创建一些类,然后在其中一个传递T对象(“model”)的方法中,我需要访问model.Property1和model.Property2 我需要将什么表达式传递到类构造函数中才能访问属性 我在想这样的事情: public MyClass(Expression<Func<T, object>> prop1, Expression<Func<T, object>> prop2) 如何访问属性本身? 类似于prop1.Invoke(model)?的

我想创建一些
,然后在其中一个传递T对象(“model”)的方法中,我需要访问
model.Property1
model.Property2

我需要将什么表达式传递到类构造函数中才能访问属性

我在想这样的事情:

public MyClass(Expression<Func<T, object>> prop1, Expression<Func<T, object>> prop2)
如何访问属性本身?
类似于
prop1.Invoke(model)

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

class MyClass<T, U>
    where T : class
    where U : struct
{ }
class-MyClass
T:在哪里上课
其中U:struct
{ }
您可以创建一个接口,以访问以下属性:

class IModel{
    public int id {get; set;}
}
class MyClass<T, U>
    where T : IModel
    where U : struct
{ }
class-IModel{
公共int id{get;set;}
}
类MyClass
T:IModel在哪里
其中U:struct
{ }
然后,当您在代码中引用T时,您可以从模型中访问id,如下所示:

    class MyClass<T, U>
        where T : IModel
        where U : struct
    { 
        public void DoStuff(T myModel){
            int a = myModel.id;
        }
    }
class-MyClass
T:IModel在哪里
其中U:struct
{ 
公共真空度(MYT模型){
int a=myModel.id;
}
}

表达式不能直接执行。为此,需要将传递的
Expression
转换为
Func
,这是通过如下方法实现的

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

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

此外,如果您只需要获得值,您可以考虑更改CONSCORTER签名以接受<代码> FUNC> /代码> S而不是

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

如前所述,使用泛型(最佳)或反射(较慢,保存较少)

您还可以滥用动态(dirty!),因为它基本上与反射相同

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

如果您不想访问properties值,那么必须获得应用于该属性的Getter-/Setter方法,因为属性只是方法的快捷方式。无法通过属性本身获取/设置值。
object p1 = model.GetType().GetProperty("Property1").GetValue(model)
dynamic d = model; 
object p1 = d.Property1;