【问题标题】:Create a object of anonymous type from a dictionary in c#从 C# 中的字典创建匿名类型的对象
【发布时间】:2017-09-28 18:04:14
【问题描述】:

一些字典,"key1" = "Value1, "key2" = "Value2", ...。 我需要创建一个对象

{ key1 : "Value1", key2 : "Value2", ... }

【问题讨论】:

  • SmartFormat.Net 库要求您以上述@grant 的形式传递对象
  • 您可能不需要这样做。 SmartFormat.NET 处理字典。 var dict = new Dictionary<String,Object>() { {"Name", "Smart"},{ "Address", new { City = "GitHub", State = "WWW" } } }; Debug.Assert("Smart from GitHub, WWW" == Smart.Format("{Name} from {Address.City}, {Address.State}", dict));
  • 您应该修改原始问题stackoverflow.com/questions/33027613/…....,而不是添加更多问题

标签: c# .net object dictionary


【解决方案1】:

您不能在运行时创建匿名类型的对象。尽管匿名类型是匿名的,但它们是 static 类型,即它们的成员在编译时是已知的。除非在编译时知道字典的所有键和值(这确实违背了目的),否则您无法从字典中创建静态类型。

下一个最接近的方法是将dynamic 类型与ExpandoObject 一起使用:

dynamic obj = new ExpandoObject();
var tmp = (IDictionary<string,object>)obj;
foreach (var p in dict) {
    tmp[p.Key] = p.Value;
}

现在你可以写了

Console.WriteLine("{0} {1}", obj.key1, obj.key2);

这将编译并运行,只要dict 包含密钥key1key2

【讨论】:

  • 不起作用:如果 obj 被声明为 ExpandoObject,编译器会给出错误消息:无法使用 [] 将索引应用于“System.Dynamic.ExpandoObject”类型的表达式。如果 obj 被声明为动态,则在运行时会出现相同的消息。
  • @Almis 我忘了您需要将ExpandoObject 转换为字典。查看编辑。
猜你喜欢
  • 2016-01-30
  • 2011-08-13
  • 1970-01-01
  • 2013-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多