これはロングショットですが、匿名のクラスをその場で作成しながら、インターフェイスまたはサブクラスを必要とするメソッドにパラメーターとしてそれらを渡すことができる面白いコーディング状況があります。つまり、次のようなことができるようになりたいのです。
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);
名前付きクラスを使用する以外にこれを行う方法はありますか?
いいえ。匿名型は常に暗黙的にobject
から派生し、インターフェイスを実装することはありません。
C#5仕様のセクション7.6.10.6から:
匿名オブジェクト初期化子は匿名型を宣言し、その型のインスタンスを返します。匿名型は、
object
から直接継承する名前のないクラス型です。
したがって、別の基本クラスが必要な場合orインターフェースを実装する場合は、名前付きの型が必要です。
いいえ。 ドキュメント から:
匿名型は、オブジェクトから直接派生するクラス型であり、オブジェクト以外の型にキャストすることはできません。
あなたの問題を解決するには、匿名型を通常のクラスに置き換えるだけです...
匿名を拡張することはできませんが、これが機能するために本当に必要な場合は、動的パラメーターを受け入れるようにメソッドを宣言できます。
短い答え:いいえ
長い答え:C#プロキシクラスを使用できます。クラスをプロキシできるツールはいくつかあります。たとえばMoqs。 https://github.com/moq/moq4