remarks example cref c# anonymous-objects

example - ¿Hay una manera fácil de combinar objetos anónimos de C#



params comments c# (3)

Digamos que tengo dos objetos anónimos como este:

var objA = new { test = "test", blah = "blah" }; var objB = new { foo = "foo", bar = "bar" };

Quiero combinarlos para obtener:

new { test = "test", blah = "blah", foo = "foo", bar = "bar" };

No sabré cuáles son las propiedades tanto para objA como para objB en tiempo de compilación. Quiero que esto sea como el método de extensión de jquery.

¿Alguien sabe de una biblioteca o una clase de .net framework que pueda ayudarme a hacer esto?


Utilizando TypeDescriptor

Como se mencionó en los comentarios, la solución de Luke Foust no funciona con tipos anónimos. La conversión al diccionario no funciona, propongo construir los diccionarios utilizando el método TypeDescriptor.GetProperties :

public static dynamic CombineDynamics(object object1, object object2) { IDictionary<string, object> dictionary1 = GetKeyValueMap(object1); IDictionary<string, object> dictionary2 = GetKeyValueMap(object2); var result = new ExpandoObject(); var d = result as IDictionary<string, object>; foreach (var pair in dictionary1.Concat(dictionary2)) { d[pair.Key] = pair.Value; } return result; } private static IDictionary<string, object> GetKeyValueMap(object values) { if (values == null) { return new Dictionary<string, object>(); } var map = values as IDictionary<string, object>; if (map == null) { return map; } map = new Dictionary<string, object>(); foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(values)) { map.Add(descriptor.Name, descriptor.GetValue(values)); } return map; }

Ahora está trabajando con tipos anónimos:

var a = new {foo = "foo"}; var b = new {bar = "bar"}; var c = CombineDynamics(a, b); string foobar = c.foo + c.bar;

Notas:

Mi método GetKeyValueMap se basa en la clase RouteValueDictionary (System.Web.Routing). Lo reescribí (usando ILSpy para desmontarlo) porque creo que una clase System.Web no tiene nada que ver con la fusión de objetos.


He intentado fusionar dos objetos en un tipo anónimo por Kyle Finley y funciona perfectamente.

Con el TypeMerger la fusión es tan simple como

var obj1 = new {foo = "foo"};

var obj2 = new {bar = "bar"};

var mergedObject = TypeMerger.MergeTypes(obj1 , obj2 );

Eso es lo que tiene el objeto fusionado, aparte de eso, hay una disposición para ignorar propiedades específicas también.


Si realmente quiere decir dinámico en el sentido de C # 4.0, entonces puede hacer algo como:

static dynamic Combine(dynamic item1, dynamic item2) { var dictionary1 = (IDictionary<string, object>)item1; var dictionary2 = (IDictionary<string, object>)item2; var result = new ExpandoObject(); var d = result as IDictionary<string, object>; //work with the Expando as a Dictionary foreach (var pair in dictionary1.Concat(dictionary2)) { d[pair.Key] = pair.Value; } return result; }

Incluso podría escribir una versión utilizando la reflexión que toma dos objetos (no dinámicos) y devuelve una dinámica.