如何使用表达式树设置和获取对象属性,而不是使用反射?
我写了下面的类,它工作正常:
public class PropertyAccessor<TEntity>
{
private readonly PropertyInfo _memberInfo;
private readonly TEntity _nom;
public PropertyAccessor(Expression<Func<TEntity, object>> fieldSelector, TEntity nom)
{
if (fieldSelector.Body is MemberExpression)
_memberInfo = (PropertyInfo)((MemberExpression)fieldSelector.Body).Member;
else if (fieldSelector.Body is UnaryExpression)
_memberInfo = (PropertyInfo)((MemberExpression)((UnaryExpression)fieldSelector.Body).Operand).Member;
else
throw new NotImplementedException("Field selector not supported");
_nom = nom;
}
public object Value
{
get { return _memberInfo.GetValue(_nom, null); }
set { _memberInfo.SetValue(_nom, value, null); }
}
}
我像这样使用它:
Product product = ProductFactory.Build();
var propertyAccessor = new PropertyAccessor<Product>(p => p.Name, product);
var name = propertyAccessor.Value;
有没有办法进一步提高它的性能?实施是最好的方法吗?
我不应该在构造函数调用之前或之后调用表达式的 Compile() 方法吗?
将 lambda 表达式传递给该 lambda 表达式的 Expression 时会发生什么?
将 MemberExpression 转换为 PropertyInfo 是最佳选择吗?任何性能处罚?