使用编译表达式的 C# 反射属性 Getter

问题描述 投票:0回答:1

我想创建一个编译表达式,而不是直接使用反射来获取对象的属性。

使用反射会是这样一些。是否可以创建等效的编译表达式?

Func<object, string, object> func = (obj, propName) =>
{
    var prop = obj.GetType().GetProperty(propName);
    var value = prop?.GetValue(obj, null);
    return value;
};
c# lambda reflection
1个回答
0
投票

您可以构建自己的

Expression
来获取对象的属性:

Expression<Func<T, TResult>> GetExpression<T, TResult>(string propName)
{
    var parameter = Expression.Parameter(typeof(T), "x");
    var property = Expression.Property(parameter, propName);

    return Expression.Lambda<Func<T, TResult>>(property, parameter);
} 

你可以像下面这样测试它:

var tc = new TestClass()
{
    Name = "test name"
};

var predicate = GetExpression<TestClass, string>(nameof(TestClass.Name));
var compiled = predicate.Compile();
Console.WriteLine(compiled(tc));
© www.soinside.com 2019 - 2024. All rights reserved.