C#动态构建匿名对象

时间:2018-11-12 14:25:00

标签: c# dynamic reflection anonymous-types reflection.emit

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

var items = new {
 Price = 2000,
 Description = "",
 Locations = new List<string> { "", "" }  
};

我的问题是,是否可以在运行时创建该对象? 我听说过 emit / meta编程,但我不知道这是否对您有帮助。

请注意,这些对象将在for循环(最多100个项目)内创建,因此我建议使用允许类型缓存的技术。

谢谢。

更新-为什么需要这个

  • 一个示例可能是像在Include中那样实现db.Users.Include("Users")功能,因此我需要在运行时按需添加Users属性。

1 个答案:

答案 0 :(得分:0)

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

由于您的讨论超出了编译过程,因此不再具有“在编译时生成(匿名)类型”选项,除非您将类型自己编译为在生成后立即加载的程序集。 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;

结果:

enter image description here