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

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

像这样的东西:

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

你不能直接声明这样的字典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)) ); }