一个字典中的值是一个匿名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)) ); }