C# 动态构建匿名对象

8
在C#中,我可以在编译时轻松地创建匿名对象,就像这样:
var items = new {
 Price = 2000,
 Description = "",
 Locations = new List<string> { "", "" }  
};

我的问题是,是否可以在运行时创建这个对象? 我听说过“emit /元编程”,但我不知道它是否有用。 请注意,这些对象将在for循环内创建(100个或更多),因此我建议使用允许类型缓存的技术。 谢谢。
更新 - 我为什么需要这个
一个例子可能是实现“Include”功能,就像“db.Users.Include("Users")”一样,所以我需要按需在运行时添加“Users”属性。

你能发一下 for 循环的代码让我们看看你在尝试什么吗? - Rahul
这样动态类型的类型有什么目的? - Patrick Hofman
1个回答

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;

结果:

enter image description here


谢谢,但在这种情况下,扩展对象不会太慢吗? - amd
1
这基本上是一个字典。那不可能真的很慢。 - Patrick Hofman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接