首页 > 解决方案 > 表达式匿名类型

问题描述

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

用法是:

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"
}

标签: c#linqexpressionanonymous-types

解决方案


注意:我不能保证这总是正确的,因为顺序可能会有所不同,应该查看源代码来确定这一点。然而,这玩起来很有趣。

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


推荐阅读