2010-04-28 18 views
13

Na przykładCzy istnieje sposób konkatowania typów anonimowych C#?

var hello = new { Hello = "Hello" }; 
var world = new { World = "World" }; 
var helloWorld = hello + world; 
Console.WriteLine(helloWorld.ToString()); 
//outputs {Hello = Hello, World = World} 

Czy istnieje jakiś sposób, aby to działało?

+2

Duży obraz ... Co chcesz zrobić? – kervin

+0

Używam ASP.Net MVC i stwierdziłem, że bardzo łatwo jest prezentować anonimowe obiekty w formacie Json za pomocą takich rzeczy jak: var posts = postService.GetPersonalPosts (1, 10, UserId); return Json (posty, JsonRequestBehavior.AllowGet); i zastanawiał się, czy istnieje sposób na łatwe połączenie właściwości dwóch anonimowych typów w jeden. –

Odpowiedz

8

Nie. Witaj i obiekty świata są obiektami różnych klas.

Jedynym sposobem połączenia tych klas jest użycie generowania dynamicznego typu (Emit). Oto przykład takiego konkatenacji: http://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx

Cytat wspomnianym artykule:

Proces działa tak: Pierwsze użycie System.ComponentModel.GetProperties do uzyskać PropertyDescriptorCollection od anonimowego typu. Fire up Reflection.Zaznaczyć, aby utworzyć nowy dynamiczny zespół i użyć TypeBuilder , aby utworzyć nowy typ, który jest złożony z wszystkich właściwości, których dotyczy dany obiekt: . Następnie zapisz nowy typ pamięci podręcznej dla ponownego użycia , aby nie trzeba było wykonywać hitu budowania nowego typu co godzinę.

+5

Zaryzykowałbym, że jeśli chcesz zrobić to wszystko dla tego rodzaju rzeczy, używasz anonimowych typów źle. –

+0

Muszę się zgodzić z Lassem. Chociaż może to być interesujące obejście problemu, nie jest rozsądnym rozwiązaniem. Dzięki za poinformowanie mnie, że nie jest to możliwe. –

1

Nie - Są to różne typy, a operator + na obu tych typach jest niezdefiniowany.

Na marginesie: nie sądzę, że masz na myśli concatenate. W języku C# konkatenacja jest czymś, co robisz do dwóch lub więcej IEnumeration s, które umieszcza je "od końca do końca". Na przykład, metoda Linqa Concat() lub String.Concat() (ciągi są "kolekcjami" char). To, co opisujesz w swoim pytaniu, przypomina raczej sprzężenie lub wielokrotne dziedziczenie między dwoma niespokrewnionymi typami. Nie mogę myśleć o niczym podobnym do tego w C#, oprócz wykorzystania jako autonomiczne typy w poniższej alternatywa:

var hello = new { Hello = "Hello" }; 
var world = new { World = "World" }; 
var helloWorld = new { hello, world }; 
Console.WriteLine(helloWorld.ToString()); 
//outputs { hello = { Hello = Hello }, world = { World = World } } 
+0

Konkatenacja była najlepszym słowem, jakie mogłem opisać łącząc dwa typy anonimowe; każdy z własną "kolekcją" członków. –

1
var helloWorld = new { Hello = hello.Hello, World = world.World }; 

Możesz napisać metodę, która robi to automatycznie przy użyciu odbicia API. To jest tak bliskie, jak to tylko możliwe.

0
var hello = new { Hello = "Hello" }; 
var world = new { World = "World" }; 
var z = new { x = hello, y = world }; 

Przeprowadź go prosto do serializatora i altówki jsss.

Powiązane problemy