【问题标题】:Add additional property to tuple c# 7向元组 c# 7 添加附加属性
【发布时间】:2017-03-16 21:04:21
【问题描述】:

进行了搜索,但找不到任何关于此的内容,所以我认为目前可能不可能。

给定以下两个元组

var a = (a: "1", b: 2);
var b = (c: "2", d: 0.1);

我是否可以将这些对象动态组合/合并为一个

var c = a + b;

理想情况下,属性的名称保持不变,因此我们仍然可以执行以下操作

var d = c.b + c.d;

我知道我可以执行以下操作,但这不适用于我想要实现的目标

var c = (first:a, second:b);

我正在寻找一个通用的解决方案,即我不在乎每个元组中有多少属性。

此外,我知道如果有两个同名的属性可能会发生什么问题。在这种情况下,我很高兴属性被覆盖或名称被更改,例如它变成了 a_1。

【问题讨论】:

  • 你可能有元组的元组,但你为什么要这样做呢?如果您的模型变得如此复杂,请创建一个真正的类来保存这些值。
  • 我想编写一个流畅的 API,它可以转发管道数据,同时仍然保持静态类型的属性名称。我知道我可以使用动态,但如果这是可能的,它将导致一个非常简洁的解决方案。例如,设想一个流畅的测试运行器,它可以通过管道将变量重用到下一步,向上下文添加更多数据只需将其他属性合并到元组中。
  • @jps 如果您想保留元组成员名称,这是不可能的。只需连接两个元组以获得更大的元组即可使用扩展方法完成,但无法保留名称。如果您想要静态检查名称,您应该真正考虑创建真实类型而不是依赖元组。
  • 元组不实现+ 运算符。如果他们这样做了,(x, y) + (a, b) 的结果可能是(x + a, y + b),而不是(x, y, a, b)

标签: c# tuples c#-7.0


【解决方案1】:

根据您描述用例的方式,您需要知道字段的名称及其值。因此,C# 7 的元组在这里没有帮助:

  1. 这些元组只是映射到ValueTuple<,>ValueTuple<,,> 等,即具有两个字段的元组和具有三个字段的元组是完全不同的类型。
  2. 字段名称只是编译器的诡计。它们作为编译器的元数据存在,但在运行时无法访问,例如通过反射。

您需要的是可以合并到新集合中的键/值对和它们的集合。因此,似乎最适合您需求的类型是 Dictionary<string,object>

【讨论】:

  • 我也很想提出类似的建议,或者ExpandoObject,但感觉更脏。
猜你喜欢
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
  • 2022-11-18
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多