Есть ли способ объединить анонимные типы C #? - PullRequest
13 голосов
/ 28 апреля 2010

Например

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

Есть ли способ заставить эту работу?

Ответы [ 5 ]

8 голосов
/ 28 апреля 2010

Нет. Привет и объекты мира - это объекты разных классов.

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

Цитата из упомянутой статьи:

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

2 голосов
/ 05 мая 2011

Аналогичный вопрос с решением с использованием динамического типа C # 4.0:

Существует ли простой способ объединения анонимных объектов C #

1 голос
/ 28 апреля 2010
var helloWorld = new { Hello = hello.Hello, World = world.World };

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

1 голос
/ 28 апреля 2010

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

В качестве примечания: я не думаю, что вы имеете в виду concatenate. В C # конкатенация - это то, что вы делаете для двух или более IEnumeration s, что ставит их «конец в конец». Например, метод Linq Concat() или String.Concat() (строки являются «коллекциями» char). То, что вы описываете в своем вопросе, больше похоже на объединение или множественное наследование между двумя несвязанными типами. Я не могу придумать ничего похожего на 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 голосов
/ 23 февраля 2011
var hello = new { Hello = "Hello" };
var world = new { World = "World" };
var z = new { x = hello, y = world };

передайте его прямо в сериал json и альт.

...