2017-03-16 67 views
2

有一个搜索,并找不到任何这个,所以我认为它可能不可能在目前。添加额外的属性元组c#7

鉴于以下两个元

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); 

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

此外,我知道可能有问题,如发生什么,如果有两个属性具有相同的名称。在这种情况下,我很高兴财产被覆盖或名称被改变,所以它成为了一个例子。

+3

你可能可能有元组的元组,但你为什么要这么做?如果你的模型变得复杂 - 建立一个真正的课程来保存这些值。 – DavidG

+0

我想编写一个流畅的API,可以转发管道数据,同时仍然保持静态类型的属性名称。我知道我可以使用一个动态的,但如果这是可能的这将导致一个非常干净的解决方案。例如,设想一个流畅的测试运行器,它可以管道变量以便重复使用到下一个步骤,向上下文添加更多数据只需要将其他属性合并到元组中。 – jps

+1

@jps这是不可能的,如果你想保留元组成员的名字。只需连接两个元组以获得更大的元组可以用扩展方法完成,但是无法保留名称。如果你想要静态检查名称,你应该真的考虑创建真正的类型而不是依赖元组。 – Kyle

回答

3

从描述用例的方式看,您需要知道该字段的名称及其值。 C#7的元组不会因此将会是帮助在这里:

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

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

+1

我很想暗示类似的东西,或者可能是'ExpandoObject',但感觉更肮脏。 – DavidG