C# 动态构建匿名对象

amd*_*amd 7 c# reflection reflection.emit dynamic anonymous-types

在 C# 中,我可以在编译时轻松创建这样的匿名对象:

var items = new {
 Price = 2000,
 Description = "",
 Locations = new List<string> { "", "" }  
};
Run Code Online (Sandbox Code Playgroud)

我的问题是,可以在运行时创建这个对象吗?我听说过发射/元编程,但我不知道它在这里是否有帮助。

请注意,这些对象将在 for 循环(100 项或更多)内创建,因此我推荐允许类型缓存的技术。

谢谢。

更新 - 为什么我需要这个

  • 一个例子可能是实现Include类似 in的功能db.Users.Include("Users"),所以我需要Users在运行时按需添加属性。

Pat*_*man 2

匿名类型是在编译时生成的,只是常规类型。

由于您谈论的是编译过程之外的内容,因此您不再具有“在编译时生成(匿名)类型”选项,除非您自己将类型编译为生成后立即加载的程序集。System.Reflection.Emit是你的朋友。但这是相当昂贵的。

就我个人而言,我会跳过所有这些麻烦,并研究一种本质上是动态的类型,例如ExpandoObject. 您可以添加属性,就像向字典添加条目一样:

dynamic eo = new System.Dynamic.ExpandoObject();
IDictionary<string, object> d = (IDictionary<string, object>)eo;
d["a"] = "b";

string a = eo.a;
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述