14

メソッド内に次のコードがあります。

 var list = new[]
  {
   new { Name = "Red", IsSelected = true },
   new { Name = "Green", IsSelected = false },
   new { Name = "Blue", IsSelected = false },
  };

各要素がインターフェイス (ISelectable) を実装する要素のリストを必要とする関数を呼び出したいと思います。これが通常のクラスでどのように行われるかは知っていますが、この場合、いくつかのデモ データを入力しようとしているだけです。

インターフェイスを実装する匿名クラスを作成することは可能ですか?

このような:

new { Name = "Red", IsSelected = true } : ISelectable
4

3 に答える 3

12

オープンソースフレームワークのimpromptu-interfaceを使用すると、軽量プロキシとDLRを使用してこれを効果的に実行できます。

new { Name = "Red", IsSelected = true}.ActLike<ISelectable>();
于 2011-03-03T01:24:09.023 に答える
12

いいえ、これは不可能です。

匿名タイプは、内部的に軽量のトランスポートオブジェクトとなることを目的としています。小さな構文が提供するよりも多くの機能が必要な場合は、通常の名前付きタイプとして実装する必要があります。

継承やインターフェースの実装、属性、メソッド、コード付きのプロパティなど。不可能です。

于 2010-06-14T13:39:44.413 に答える
1

これができたとしても、メソッドは匿名クラスに関するすべてを知っているので、ほぼ間違いなく知りたくないでしょう(つまり、カプセル化がなく、間接的にアクセスするメリットもありません)。

一方、私はそのような機能がどのように見えるかについて考えました(匿名で型指定されたオブジェクトを特定のインターフェイスを期待するメソッドに渡したい場合に役立つ可能性があります...またはそう思いました)。

インターフェイスIFooを継承する匿名型の最小の構文は次のようになります。

new {IFoo.Bar = 2} // if IFoo.Bar is a property

or

new {IFoo.Bar() = () => do stuff} if IFoo.Bar is a method

ただし、これは、IFooにプロパティまたはメソッドが1つしかない単純なケースです。通常、IFooのすべてのメンバーを実装する必要があります。読み取り/書き込みプロパティと、匿名で型指定されたオブジェクトでは現在も不可能なイベントを含みます。

于 2010-06-14T16:40:55.163 に答える