寻找一种在表达式树中访问匿名对象的属性和值的方法。最终,通过匿名对象传递的键/值对将用作字符串。我找到了如何访问关键部分,但我找不到值部分。
用法是:
object.ExpressionBuilder<Company>(dc => new { DCCODE = dc.CompanyCode })
方法是:
ExpressionBuilder<T>(Expression<Func<T, object>> expr)
{
var propertyName = expr.Body.Type.GetProperties()[0].Name; //this gets "DCCODE" as a string
var valueName = "dc.CompanyCode"; //looking for a way to get the matching value as either "CompanyCode" or "dc.CompanyCode"
}
答案 0 :(得分:0)
注意:我不能保证这总是正确的,因为 的排序可能会有所不同,应该查看源代码以确定这一点。但是,这很有趣。
var body = (NewExpression)expr.Body;
var zipped = body.Members.Zip(body.Arguments, (member, argument) => new KeyValuePair<MemberInfo, MemberExpression>(member, argument));
foreach (var zip in zipped)
{
Console.WriteLine("Property name: {0}, property argument: {1}", zip.Key.Name, zip.Value.ToString());
}
这将打印:
属性名称:DCODE,属性参数:dc.CompanyCode
答案 1 :(得分:0)
解析表达式的最佳方法是创建自定义ExpressionVisitor
。匿名类型构造由NewExpression
节点表示,您可以从该节点访问成员和参数。
public class CustomExpressionVisitor : ExpressionVisitor
{
protected override Expression VisitNew(NewExpression node)
{
Console.WriteLine($"{node.Members?.First().Name} {node.Arguments.FirstOrDefault()}");
return base.VisitNew(node);
}
}
然后你可以像这样使用它:
var expressionVisitor = new CustomExpressionVisitor();
expressionVisitor.Visit(expr);
使用值打印第一个属性:
DCCODE dc.CompanyCode
当然,您可以使用此类在这样的表达式树上执行您喜欢的任何转换。