2017-03-16 31 views
2

これで何かを見つけることができないので、現時点では不可能かもしれないと思っています。タプルC#7に追加プロパティを追加

を考えると、次の2つのタプル

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

それは私が動的ので、我々はまだやることができます維持されているプロパティの理想的名を/構成する1

var c = a + b; 

にこれらのオブジェクトをマージすることは可能です次のとおりです

var d = c.b + c.d; 

私は次のようなことができると知っていますこれは私が

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

を達成したいもののために動作しませんT Iはつまり、私は、各タプルにあるどのように多くの性質を気にしない、一般的な解決策を探しています。

さらに、同じ名前のプロパティが2つあるとどうなるかなどの問題がある可能性があります。このようなシナリオでは、プロパティが上書きされるか、名前が変更されることに満足しているので、たとえばa_1になりました。

+3

タプルのタプルがある可能性がありますが、なぜそれをしたいのですか?あなたのモデルが複雑になっている場合は、代わりに値を保持する実クラスを作成してください。 – DavidG

+0

静的に型指定されたプロパティ名を維持しながらパイプデータを転送できる流暢なAPIを作成したいと思います。私はダイナミックを使用することができることを知っていますが、可能であれば、これは非常にきちんとした解決策につながります。たとえば、再利用のための変数を次のステップにパイプすることができる流暢なテストランナーを想像してください。コンテキストにデータを追加するだけで、追加のプロパティをタプルにマージすることになります。 – jps

+1

@jpsタプルメンバー名を保持したい場合は、これは不可能です。より大きなタプルを得るために2つのタプルを連結するだけで、拡張メソッドで行うことができますが、名前を保持する方法はありません。静的にチェックされた名前が必要な場合は、タプルに頼るのではなく、実際の型を作成することを考えなければなりません。 – Kyle

答えて

3

ユースケースの記述方法から、フィールドの名前とその値の両方を知る必要があります。 C#7のタプルはので、ここで助けになるつもりはありません。

  1. これらのタプルはちょうどValueTuple<,,>はなど、すなわち2つのフィールドを持つタプルと3とのタプルが完全に異なる種類があり、ValueTuple<,>にマップされます。
  2. フィールド名は単なるコンパイラのトリッキーです。コンパイラのメタデータとして存在しますが、実行時にはリフレクションなどでアクセスできません。

必要なものは、新しいセットにマージできるキーと値のペアとそのセットです。したがって、お客様のニーズに最も適していると思われるタイプはDictionary<string,object>となります。

+1

私はこれもまた、おそらく 'ExpandoObject'のようなものを提案するように誘惑されましたが、それはもっと汚れているように感じます。 – DavidG

関連する問題