Convertir diccionario ¿A objeto anónimo?

Primero, y para aclarar las cosas, explicaré mi escenario desde arriba:

Tengo un método que tiene la siguiente firma:

public virtual void SendEmail(String from, List recepients, Object model) 

Lo que quiero hacer es generar un objeto anónimo que tenga las propiedades del objeto modelo junto con los dos primeros parámetros también. Aplanar el objeto modelo en PropertyInfo [] es muy sencillo. En consecuencia, pensé en crear un diccionario que contenga los PropertyInfo y los primeros dos params, y luego convertirlo en el objeto anónimo donde la clave es el nombre de la propiedad y el valor es el valor real de la propiedad.

¿Es eso posible? ¿Cualquier otra sugerencia?

Si realmente desea convertir el diccionario a un objeto que tenga los elementos del diccionario como propiedades, puede usar ExpandoObject :

 var dict = new Dictionary { { "Property", "foo" } }; var eo = new ExpandoObject(); var eoColl = (ICollection>)eo; foreach (var kvp in dict) { eoColl.Add(kvp); } dynamic eoDynamic = eo; string value = eoDynamic.Property; 

Pero no estoy seguro de cómo te va a ayudar eso.

Si también tiene una clase que desea ocultar el diccionario, puede usar lo siguiente para convertir un diccionario a un objeto de esa clase:

Clase de ejemplo:

 public class Properties1 { public string Property { get; set; } } 

La solución:

 JavaScriptSerializer serializer = new JavaScriptSerializer(); Dictionary dict = new Dictionary { { "Property", "foo" } }; Properties1 properties = serializer.ConvertToType(dict); string value = properties.Property; 

También puede usar un método como este para construir el objeto desde el diccionario, obviamente esto también requiere que tenga una clase.

 private static T DictionaryToObject(IDictionary dict) where T : new() { T t = new T(); PropertyInfo[] properties = t.GetType().GetProperties(); foreach (PropertyInfo property in properties) { if (!dict.Any(x => x.Key.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase))) continue; KeyValuePair item = dict.First(x => x.Key.Equals(property.Name, StringComparison.InvariantCultureIgnoreCase)); Type tPropertyType = t.GetType().GetProperty(property.Name).PropertyType; Type newT = Nullable.GetUnderlyingType(tPropertyType) ?? tPropertyType; object newA = Convert.ChangeType(item.Value, newT); t.GetType().GetProperty(property.Name).SetValue(t, newA, null); } return t; } 

Sin embargo, si no tiene la clase, puede crear un objeto dynamic a partir de un diccionario como este:

 private static dynamic DictionaryToObject(Dictionary dict) { IDictionary eo = new ExpandoObject() as IDictionary; foreach (KeyValuePair kvp in dict) { eo.Add(kvp); } return eo; } 

Puedes usarlo así:

 Dictionary dict = new Dictionary {{ "Property", "foo" }}; dynamic properties = DictionaryToObject(dict); string value = properties.Property; 

Intenté hacer esto en una statement con una función de reducción (Agregado en Linq). El código a continuación hace lo mismo que la respuesta aceptada:

 var dict = new Dictionary { { "Property", "foo" } }; dynamic eo = dict.Aggregate(new ExpandoObject() as IDictionary, (a, p) => { a.Add(p.Key, p.Value); return a; }); string value = eo.Property; 

Los objetos anónimos son uno que generó para usted el comstackdor. No puede generar dinámicamente crear uno. Por otro lado, puedes emitir ese objeto, pero realmente no creo que sea una buena idea.

¿Puede ser que puedas probar objetos dynamics? El resultado será un objeto con todas las propiedades que necesita.