我想创建一个编译表达式,而不是直接使用反射来获取对象的属性。
使用反射会是这样一些。是否可以创建等效的编译表达式?
Func<object, string, object> func = (obj, propName) =>
{
var prop = obj.GetType().GetProperty(propName);
var value = prop?.GetValue(obj, null);
return value;
};
您可以构建自己的
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));