表达式匿名类型

3

寻找一种方法,在表达式树中访问匿名对象的属性和值。最终,通过匿名对象传递的键/值对将用作字符串。我已经找到了如何访问键部分,但是在查找值部分时遇到了问题。

使用方法如下:

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"
}
2个回答

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


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

当然,您可以使用此类对此类表达式树进行任何转换。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接