一个字典中的值是一个匿名types在C#

是否有可能在C#中创build一个System.Collections.Generic.Dictionary<TKey, TValue>其中TKey是无条件的类和TValue – 一个具有一些属性的匿名类,例如 – 数据库列名称和它的本地化名称。

像这样的东西:

 new { ID = 1, Name = new { Column = "Dollar", Localized = "Доллар" } } 

4 Solutions collect form web for “一个字典中的值是一个匿名types在C#”

你不能直接声明这样的字典types(有kludges,但这些只是为了娱乐和新奇的目的),但是如果你的数据来自IEnumerable或IQueryable源,你可以使用LINQ ToDictionary操作符来获得一个所需的键和来自序列元素的(匿名types)值:

 var intToAnon = sourceSequence.ToDictionary( e => e.Id, e => new { e.Column, e.Localized }); 

正如itowlson 所说 ,你不能宣布这样一个野兽,但你确实可以创造一个:

 static IDictionary<TKey, TValue> NewDictionary<TKey, TValue>(TKey key, TValue value) { return new Dictionary<TKey, TValue>(); } static void Main(string[] args) { var dict = NewDictionary(new {ID = 1}, new { Column = "Dollar", Localized = "Доллар" }); } 

目前还不清楚为什么你真的想要使用这样的代码。

你可以做一个reflection

 public static class ObjectExtensions { /// <summary> /// Turn anonymous object to dictionary /// </summary> /// <param name="data"></param> /// <returns></returns> public static IDictionary<string, object> ToDictionary(this object data) { var attr = BindingFlags.Public | BindingFlags.Instance; var dict = new Dictionary<string, object>(); foreach (var property in data.GetType().GetProperties(attr)) { if (property.CanRead) { dict.Add(property.Name, property.GetValue(data, null)); } } return dict; } } 

我想ASP.NET MVC在这个问题发生的时候并没有退出。 它将内部的匿名对象转换为字典。

例如,只要看一下HtmlHelper类 。 将对象转换为字典的方法是AnonymousObjectToHtmlAttributes 。 它是特定于MVC并返回一个RouteValueDictionary ,但是。

如果你想要更通用的东西,试试这个:

 public static IDictionary<string,object> AnonymousObjectToDictionary(object obj) { return TypeDescriptor.GetProperties(obj) .OfType<PropertyDescriptor>() .ToDictionary( prop => prop.Name, prop => prop.GetValue(obj) ); } 

这种实现的一个优势在于它返回null对象的空字典。

这里有一个通用版本:

 public static IDictionary<string,T> AnonymousObjectToDictionary<T>( object obj, Func<object,T> valueSelect ) { return TypeDescriptor.GetProperties(obj) .OfType<PropertyDescriptor>() .ToDictionary<PropertyDescriptor,string,T>( prop => prop.Name, prop => valueSelect(prop.GetValue(obj)) ); } 
  • 为什么IQueryable.All()在空集合上返回true?
  • NHibernate与LINQ to SQL
  • 我可以分裂一个IEnumerable两个布尔条件没有两个查询?
  • 你最喜欢的LINQ to Objects运算符是不是内置的?
  • LINQ环:任何()与包含()巨大的集合
  • LINQ to Entities不支持指定的types成员“Date”。 只有初始化器,实体成员和实体导航属性
  • 如何查看LINQ生成的SQL语句?
  • LINQ - 哪里不存在
  • 为什么IEnumerable <T> .ToList <T>()返回List <T>而不是IList <T>?
  • 为什么使用AsQueryable()而不是List()?
  • 使用Linq将对象列表分组到对象列表的新分组列表中