表达式匿名类型

时间:2018-05-07 22:25:20

标签: c# linq expression anonymous-types

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

用法是:

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 :(得分: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

当然,您可以使用此类在这样的表达式树上执行您喜欢的任何转换。