c# - 如何使用表达式树构建匿名对象

标签 c# dynamic reflection expression-trees anonymous-types

我有课

public class SomeClass
{
    public int num { get; set; }
    public string str{ get; set; }
}

我需要构造一个 lambda 表达式,例如:(x => new {new_num= x.num, new_str= x.str})

属性列在一些可枚举对象中(这很重要)。比方说 List<KeyValuePair<string, string>>

我的代码是:

// Test properties list
var listOfParams = new List<KeyValuePair<string, string>>();
listOfParams.Add(new KeyValuePair<string, string>("new_num","num"));
listOfParams.Add(new KeyValuePair<string, string>("new_str","str"));

// SomeClass as particular test case
var tModelType = typeof(SomeClass); 

ParameterExpression pe = Expression.Parameter(tModelType, "m");
NewExpression ne = Expression.New(typeof(object)); //<-- trying to emulate `new object{}`

List<Expression> lInit = new List<Expression>(); 

PropertyInfo pi;
string sAnonymousProperty;

Type propertyType;
foreach(var paramElem in listOfParams)
{
   pi = tModelType.GetProperty(paramElem.Value);
   propertyType = pi.PropertyType;
   sAnonymousProperty = paramElem.Value;

   Expression bind = ??Expression??  // <-- here I need to build binding expression

   lInit.Add( bind );
}

ListInitExpression lie = Expression.ListInit(ne, lInit);

LambdaExpression leResult = Expression.Lambda(lie, pe);

我想不出绑定(bind)表达式,因为它需要匿名对象没有的 MemberInfo。我也无法使用 new { new_num = 0, new_str = "" }.GetType() 绕过它因为属性是未知的,并且以某种数组的形式作为参数出现。

也许我的方法根本无效,有人会建议另一种方法,但主要思想是获取 lambda 表达式/"Func"-delegate,它创建具有动态重新映射属性的匿名对象。

感谢任何帮助。

最佳答案

这种方法基本上是无效的,因为没有合适的类型可以引用。就 CLR 而言,匿名类型只是一种普通类型——编译器只是为您生成类型。 (在 Microsoft 的实现中,它实际上生成了一个泛型类型,该泛型类型用于每个具有相同属性名称的匿名类型,并以相同的顺序使用。)

因此,为了模拟这一点,您还需要创建自己的类型。或者,您可以使用 Tuple<T1, T2>等等 - 根据您拥有的属性数量使用正确的元组类型。

关于c# - 如何使用表达式树构建匿名对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23983029/

相关文章:

c# - 如何创建其他窗口继承的窗口?

c# - 如何添加表单加载事件(目前不工作)

Android : How to not overlap dynamic views? + View 的动态位置

c# - 使用 Roslyn 创建部分类 - 一个在运行时编译的类

java - 为什么我无法从已加载的 Java 类中检测到注释?

c# - 通过 Linq 表达式指定 MethodInfo 的面向 future 的方法

c# - 防止 Button 继承 Parent 的 BackColor

c# - Serialization 中传递的数据是什么? (二进制序列化)

c# - System.Linq.Dynamic - 我可以在 WHERE 语句中使用 IN 子句吗

c# - 什么更快 : expression trees or manually emitting IL