有没有办法连接C#匿名类型?

时间:2010-04-28 04:56:21

标签: c# types anonymous

例如

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

有没有办法让这项工作?

5 个答案:

答案 0 :(得分:8)

没有。 hello和world对象是不同类的对象。

合并这些类的唯一方法是使用动态类型生成(Emit)。以下是此类连接的示例:http://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx

引用上述文章:

  

这个过程是这样的:首次使用   System.ComponentModel.GetProperties到   获取PropertyDescriptorCollection   来自匿名类型。火起来   Reflection.Emit创建一个新的   动态组装并使用TypeBuilder   创建一个新的类型   所有属性的复合   参与其中。然后缓存新类型   重复使用,所以你不必采取   每个人都打造新型   你需要它的时间。

答案 1 :(得分:2)

与使用C#4.0动态类型的解决方案类似的问题:

Is there an easy way to merge C# anonymous objects

答案 2 :(得分:1)

否 - 它们是不同的类型,这两种类型的+运算符未定义。

作为旁注:我认为你不是concatenate。在C#中,连接是你对两个或多个IEnumeration做的事情,它们将它们“端对端”。例如,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 } }

答案 3 :(得分:1)

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

您可以编写一个使用反射API自动执行此操作的方法。我认为可能就是这样。

答案 4 :(得分:0)

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

将它传递给json序列化器和中提琴。