【问题标题】:Is there a way to concat C# anonymous types?有没有办法连接 C# 匿名类型?
【发布时间】:2011-02-13 04:34:24
【问题描述】:

例如

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

有什么办法可以做到吗?

【问题讨论】:

  • 大局...,你想做什么?
  • 我正在使用 ASP.Net MVC,并且发现使用以下方式以 Json 格式呈现匿名对象非常容易: var posts = postService.GetPersonalPosts(1, 10, UserId);返回 Json(帖子,JsonRequestBehavior.AllowGet);并且想知道是否有一种方法可以轻松地将两种匿名类型的属性组合成一个。

标签: c# types anonymous


【解决方案1】:

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

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

引用文章:

这个过程是这样的:第一次使用 System.ComponentModel.GetProperties 到 获取一个 PropertyDescriptorCollection 从匿名类型。火起来 Reflection.Emit 创建一个新的 动态组装和使用 TypeBuilder 创建一个新类型 所有属性的组合 涉及。然后缓存新类型 重复使用,所以你不必采取 每次建造新类型的成功 你需要的时候。

【讨论】:

  • 我敢说,如果你需要为这种事情做所有这些,你使用的匿名类型是错误的。
  • 我不得不同意 Lasse 的观点。虽然这可能是一个有趣的解决方法,但它不是一个合理的解决方案。感谢您让我知道这是不可能的。
【解决方案2】:

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

附带说明:我认为您的意思不是concatenate。在 C# 中,连接是您对两个或多个 IEnumerations 执行的操作,使它们“端到端”。例如,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】:
var helloWorld = new { Hello = hello.Hello, World = world.World };

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

【讨论】:

    【解决方案4】:
    var hello = new { Hello = "Hello" };
    var world = new { World = "World" };
    var z = new { x = hello, y = world };
    

    将其传递给 json 序列化程序和 viola。

    【讨论】:

      猜你喜欢
      • 2010-11-22
      • 2018-07-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-21
      • 2022-11-29
      • 2011-03-24
      • 2011-03-30
      • 1970-01-01
      相关资源
      最近更新 更多