Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Dictionary to anonymous type

//The MIT License (MIT) //http://arolibraries.codeplex.com/license using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace AroLibraries.ExtensionMethods.Enumerable {     public static class IDictionaryExt     {         public static TValue Ext_GetValueOrDefault<TKey, TValue>(this IDictionary<TKey, TValue> dict, TKey key)         {             TValue result;             dict.TryGetValue(key, out result);             return result;         }         /// <summary>         ///          /// </summary>         /// <see cref="http://jacobcarpenter.wordpress.com/2008/03/13/dictionary-to-anonymous-type/"/>         /// <example>         ///        var dict = new Dictionary<string, object> {         ///    { "Name", "Jacob" },         ///    { "Age", 26 },         ///    { "FavoriteColors", new[] { ConsoleColor.Blue, ConsoleColor.Green } },         ///    };         ///    var person = dict.ToAnonymousType(         ///     new         ///    {         ///    Name = default(string),         ///    Age = default(int),         ///    FavoriteColors = default(IEnumerable<ConsoleColor>),         ///    Birthday = default(DateTime?),         ///     });         /// </example>         /// <typeparam name="T"></typeparam>         /// <typeparam name="TValue"></typeparam>         /// <param name="dict"></param>         /// <param name="anonymousPrototype"></param>         /// <returns></returns>         public static T Ext_ToAnonymousType<T, TValue>(this IDictionary<string, TValue> dict, T anonymousPrototype)         {             // get the sole constructor             var ctor = anonymousPrototype.GetType().GetConstructors().Single();             // conveniently named constructor parameters make this all possible...             var args = from p in ctor.GetParameters()                        let val = dict.Ext_GetValueOrDefault(p.Name)                        select val != null && p.ParameterType.IsAssignableFrom(val.GetType()) ? (object)val : null;             return (T)ctor.Invoke(args.ToArray());         }     } }