13

例えば

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

これを機能させる方法はありますか?

4

4 に答える 4

8

いいえ。helloオブジェクトとworldオブジェクトは異なるクラスのオブジェクトです。

これらのクラスをマージする唯一の方法は、動的型生成(Emit)を使用することです。このような連結の例を次に示します。http ://www.developmentalmadness.com/archive/2008/02/12/extend-anonymous-types-using.aspx

言及された記事からの引用:

プロセスは次のように機能します。最初にSystem.ComponentModel.GetPropertiesを使用して、匿名タイプからPropertyDescriptorCollectionを取得します。Reflection.Emitを起動して新しい動的アセンブリを作成し、TypeBuilderを使用して関連するすべてのプロパティの複合である新しいタイプを作成します。次に、新しいタイプをキャッシュして再利用できるようにします。これにより、必要になるたびに新しいタイプを作成する必要がなくなります。

于 2010-04-28T05:05:39.600 に答える
1

いいえ-これらは異なるタイプであり、+両方のタイプの演算子は未定義です。

補足として:私はあなたが意味するとは思わないconcatenate。C#では、連結とは2つ以上IEnumerationのsに対して行うことであり、それらを「エンドツーエンド」にします。たとえば、LinqメソッドConcat()またはString.Concat()(文字列はcharの「コレクション」です)。質問で説明するのは、2つの無関係なタイプ間の結合または多重継承のようなものです。以下の代替案のように自律型を使用する以外に、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 } }
于 2010-04-28T05:16:08.763 に答える
1
var helloWorld = new { Hello = hello.Hello, World = world.World };

リフレクション API を使用して、これを自動的に行うメソッドを作成できます。それは私が可能な限りこれに近いです。

于 2010-04-28T05:27:39.500 に答える
0
var hello = new { Hello = "Hello" };
var world = new { World = "World" };
var z = new { x = hello, y = world };

jsonシリアライザーとビオラに直接渡します。

于 2011-02-23T20:23:22.900 に答える