web-dev-qa-db-ja.com

匿名クラスに別のクラスを継承させることは可能ですか?

これはロングショットですが、匿名のクラスをその場で作成しながら、インターフェイスまたはサブクラスを必要とするメソッドにパラメーターとしてそれらを渡すことができる面白いコーディング状況があります。つまり、次のようなことができるようになりたいのです。

public class MyBase { ... }

public void Foo(MyBase something)
{
  ...
}

...
var q = db.SomeTable.Select(t =>
        new : MyBase // yeah, I know I can't do this...
        {
          t.Field1,
          t.Field2,
        });
foreach (var item in q)
  Foo(item);

名前付きクラスを使用する以外にこれを行う方法はありますか?

51
Shaul Behr

いいえ。匿名型は常に暗黙的にobjectから派生し、インターフェイスを実装することはありません。

C#5仕様のセクション7.6.10.6から:

匿名オブジェクト初期化子は匿名型を宣言し、その型のインスタンスを返します。匿名型は、objectから直接継承する名前のないクラス型です。

したがって、別の基本クラスが必要な場合orインターフェースを実装する場合は、名前付きの型が必要です。

49
Jon Skeet

いいえ。 ドキュメント から:

匿名型は、オブジェクトから直接派生するクラス型であり、オブジェクト以外の型にキャストすることはできません。

あなたの問題を解決するには、匿名型を通常のクラスに置き換えるだけです...

7
Shlomi Borovitz

匿名を拡張することはできませんが、これが機能するために本当に必要な場合は、動的パラメーターを受け入れるようにメソッドを宣言できます。

2
T McKeown

短い答え:いいえ

長い答え:C#プロキシクラスを使用できます。クラスをプロキシできるツールはいくつかあります。たとえばMoqs。 https://github.com/moq/moq4

0
Anders