获取 T 的属性

本文关键字:属性 获取 | 更新日期: 2023-09-27 18:30:24

我想创建一些class<T>,然后在T对象("模型")通过的方法之一中,我需要访问model.Property1model.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)

获取 T 的属性

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

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;
        }
    }