2010-04-28 16 views
13

Por ejemplo¿Hay alguna manera de concaturar los tipos anónimos de C#?

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

¿Hay alguna manera de hacer este trabajo?

+2

El panorama ..., ¿qué estás tratando de hacer? – kervin

+0

Estoy utilizando ASP.Net MVC y he encontrado que es muy fácil presentar objetos anónimos en formato Json utilizando algunas cosas como esta: var posts = postService.GetPersonalPosts (1, 10, UserId); return Json (posts, JsonRequestBehavior.AllowGet); y me preguntaba si había una manera de combinar fácilmente las propiedades de dos tipos anónimos en uno. –

Respuesta

8

No. Los objetos hello y world son objetos de diferentes clases.

La única forma de fusionar estas clases es utilizar la generación dinámica de tipos (Emit). Aquí es ejemplo de dicha concatenación: http://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx

Presupuesto de artículo mencionado:

El proceso es el siguiente: En primer lugar utilizar System.ComponentModel.GetProperties a obtener una PropertyDescriptorCollection del tipo anónimo. Arranque Reflection.Emit para crear un nuevo ensamblado dinámico y use TypeBuilder para crear un nuevo tipo que sea un compuesto de todas las propiedades involucradas . A continuación, guarde en caché el nuevo tipo para la reutilización de , de modo que no tenga que tomar el de compilar el nuevo tipo cada vez que lo necesite.

+5

Me atrevería a decir que si necesita hacer todo esto para este tipo de cosas, está usando los tipos anónimos equivocados. –

+0

Voy a tener que estar de acuerdo con Lasse. Si bien podría ser una solución interesante, no es una solución razonable. Gracias por hacerme saber que no es posible. –

1

No - Son tipos diferentes y el operador + en ambos tipos no está definido.

Como nota al margen: no creo que se refiera a concatenate. En C#, la concatenación es algo que haces para dos o más IEnumeration s que los pone "de extremo a extremo". Por ejemplo, el método de Linq Concat() o String.Concat() (las cadenas son "colecciones" de caracteres). Lo que describes en tu pregunta es más como una unión o herencia múltiple entre dos tipos no relacionados. No puedo pensar en algo similar a la de C#, además de utilizar los tipos autónomos como en la alternativa a continuación:

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

Concatenación fue la mejor palabra que pude encontrar para describir la fusión de dos tipos anónimos; cada uno con sus propias "colecciones" de miembros. –

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

Usted puede escribir un método que hace esto automáticamente utilizando la API de reflexión. Eso es lo más cercano a esto que veo posible.

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

pásalo directamente al json serializer y viola.

Cuestiones relacionadas