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

Например

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

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

Ответы

Ответ 1

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

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

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

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

Ответ 3

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

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

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 } }

Ответ 4

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

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

Ответ 5

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

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