如何构建,将实现以下目标的表达式:
public object Eval(object rootObj, string propertyString)
例如: Eval(person, "Address.ZipCode") => return person.Address.ZipCode
Expression.PropertyOrField不起作用,因为我没有每一个中间属性的类型。 我想避免创建一个脚本库的依赖。
我想尝试使用表达式,因为它可以让我来存储这些表达式树的缓存,因为他们将被执行多次。 我知道,它可能与反思迭代或递归地做到这一点。
这听起来像你正在寻找的东西是这样的:
public object Eval(object root, string propertyString)
{
var propertyNames = propertyString.Split('.');
foreach(var prop in propertyNames)
{
var property = root.GetType().GetProperty(prop);
if (property == null)
{
throw new Exception(...);
}
root = property.GetValue(root, null);
}
return root;
}
要创建一个Expression
使用:
public Expression Eval(object root, string propertyString)
{
var propertyNames = propertyString.Split('.');
ParameterExpression param = Expression.Parameter(root.GetType, "_");
Expression property = param;
foreach(var prop in propertyName)
{
property = Expression.PropertyOrField(property, prop);
}
return Expression.Lambda(property, param);
}
这里是PSWG代码的递归版本,有工作Expressions
。
public Expression Eval(Expression expression, string property)
{
var split = property.Split('.');
if (split.Length == 1)
{
return Expression.PropertyOrField(expression, property);
}
else
{
return Eval(Expression.PropertyOrField(expression, split[0]), property.Replace(split[0] + ".", ""));
}
}