获取 T 的属性
本文关键字:属性 获取 | 更新日期: 2023-09-27 18:30:24
我想创建一些class<T>
,然后在T对象("模型")通过的方法之一中,我需要访问model.Property1
并model.Property2
我需要将什么表达式传递到类构造函数中才能访问属性?
我在想这样的事情:
public MyClass(Expression<Func<T, object>> prop1, Expression<Func<T, object>> prop2)
但在这里我只找到了如何使用 MemberInformation 获取属性名称(我也需要):
void MyMethod(T model, ...)
{
Console.WriteLine(prop1.Member.Name)
}
如何访问属性本身?像prop1.Invoke(model)
?
如前所述,要么使用泛型(最佳)或反射(较慢,保存较少)
object p1 = model.GetType().GetProperty("Property1").GetValue(model)
你也可以滥用动态(肮脏!),因为它基本上与反射相同
dynamic d = model;
object p1 = d.Property1;
表达式
不能直接执行。为此,您需要将传递的Expression<Func<..>>
转换为Func<..>
,这是通过像这样的Compile方法实现
void MyMethod(T model, ...)
{
var prop1Value1 = prop1.Compile()(model);
}
出于性能原因,您可以考虑在类构造函数中编译表达式,并将生成的委托存储在类字段中。
此外,如果您只需要能够获取值,则可以考虑更改构建器签名以接受Func<..>
public MyClass(Func<T, object> prop1, Func<T, object> prop2)
如果您使用如下内容为对象创建泛型类:
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;
}
}