Existe-t-il un moyen simple de fusionner des objects anonymes C #

Disons que j’ai deux objects anonymes comme ceci:

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

Je veux les combiner pour obtenir:

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

Je ne saurai pas quelles sont les propriétés d’objA et d’objB au moment de la compilation. Je veux que ce soit comme la méthode d’extension de jquery.

Quelqu’un connaît-il une bibliothèque ou une classe d’infrastructure .net qui peut m’aider à faire cela?

Si vous voulez vraiment dire dynamic au sens de C # 4.0, vous pouvez faire quelque chose comme:

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

Vous pouvez même écrire une version en utilisant la reflection qui prend deux objects (non dynamic) et renvoie une dynamic.

J’ai essayé de fusionner deux objects dans un type anonyme de Kyle Finley et cela fonctionne parfaitement.

Avec le TypeMerger la fusion est aussi simple que

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

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

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

C’est-à-dire que vous avez obtenu l’object fusionné, mis à part cela, il existe également une disposition permettant d’ignorer des propriétés spécifiques.

Utiliser TypeDescriptor

Comme mentionné dans les commentaires, la solution Luke Foust ne fonctionne pas avec les types anonymes. La conversion en dictionnaire ne fonctionne pas, je propose de construire les dictionnaires à l’ aide de la méthode TypeDescriptor.GetProperties :

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

Cela fonctionne maintenant avec les types anonymes:

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

Remarques:

Ma méthode GetKeyValueMap est basée sur la classe RouteValueDictionary (System.Web.Routing). Je l’ai réécrit (en utilisant ILSpy pour le désassembler) car je pense qu’une classe System.Web n’a rien à voir avec la fusion d’objects.