我想创建一些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)
}
?
答案 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;