【问题标题】:C# Build anonymous object dynamicallyC#动态构建匿名对象
【发布时间】:2019-04-15 07:04:03
【问题描述】:

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

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

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

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

谢谢。

更新 - 为什么我需要这个

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

【问题讨论】:

  • 你能把for循环的代码贴出来看看你在做什么
  • 这种动态类型类型的目的是什么?

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


【解决方案1】:

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

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

结果:

【讨论】:

  • 谢谢,在这种情况下,expando 对象不是慢了两个吗?
  • 它基本上是一本字典。这不可能真的那么慢。
猜你喜欢
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 2016-04-21
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多