Есть ли способ конкатенировать анонимные типы С#?
Например
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 для создания нового типа, который является совокупность всех свойств участвует. Затем кешируйте новый тип для поэтому вы не должны удар по строительству нового типа время, в котором вы нуждаетесь.
Ответ 2
Аналогичный вопрос с решением с использованием динамического типа С# 4.0:
Есть ли простой способ объединить анонимные объекты С#
Ответ 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 и альт.