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;