2010-04-28 27 views
13

НапримерЕсть ли способ конкатенировать анонимные типы C#?

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

Есть ли способ, чтобы сделать эту работу?

+2

Большая картина ... Что вы пытаетесь сделать? – kervin

+0

Я использую ASP.Net MVC и нашел очень легким представление анонимных объектов в формате Json, используя такие вещи: var posts = postService.GetPersonalPosts (1, 10, UserId); return Json (сообщения, JsonRequestBehavior.AllowGet); и задавался вопросом, есть ли способ легко объединить свойства двух анонимных типов в один. –

ответ

8

Нет. Hello and world objects - объекты разных классов.

Единственный способ объединить эти классы - использовать генерацию динамического типа (Emit). Вот пример такой конкатенации: http://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx

Цитата указанной статьи:

Процесс работает следующим образом: Сначала System.ComponentModel.GetProperties в получить PropertyDescriptorCollection от анонимного типа. Запустите Reflection.Emit, чтобы создать новую динамическую сборку и использовать TypeBuilder для создания нового типа, который представляет собой составной состав всех свойств, которые были связаны с . Затем кешируйте новый тип для повторного использования , так что вам не нужно принимать хит нового типа каждые времени, в котором оно вам понадобится.

+5

Я бы рискнул, что если вам нужно сделать все это для такого рода вещей, вы используете анонимные типы неправильно. –

+0

Мне нужно согласиться с Лассе. Хотя это может быть интересным решением, это не разумное решение. Спасибо, что позволили мне узнать, что это невозможно. –

1

Нет - они разные типы, а оператор + на обоих этих типах не определен.

В качестве примечания стороны: я не думаю, что вы имеете в виду concatenate. В C# конкатенация - это то, что вы делаете с двумя или более IEnumeration s, которые ставят их «от конца до конца». Например, метод Linq Concat() или String.Concat() (строки являются «коллекциями» символов). То, что вы описываете в своем вопросе, больше похоже на объединение или множественное наследование между двумя несвязанными типами. Я не могу думать ничего подобного тому, что в C#, помимо использования автономных типов, как в следующей альтернативе:

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

Конкатенация была лучшим словом, которое я мог найти, чтобы описать слияние двух анонимных типов; каждый со своими «коллекциями» членов. –

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

Вы можете написать метод, который делает это автоматически с помощью Reflection API. Это так близко, как я вижу.

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

передать это право на сериализатор json и альта.

Смежные вопросы