0

注: C# には匿名型と内部型があることは承知していますが、これらは古い Java の匿名内部クラスとは著しく異なる役割を果たします。

インターフェースがあるとします:

public interface Foo<T>
{
    int Fizz(string a);
    T Buzz(object o);
    void Crackle();
}

Java スタイルの AIC の役割を果たす (つまり、インラインで機能を定義できる) 実装クラスを生成できる何か (ReSharper マクロなど) はありますか? すなわち

public class FooAIC<T> : Foo<T>
{
    public Func<string, int> Fizz;
    public Func<object, T> Buzz;
    public Action Crackle;

    int Foo<T>.Fizz(string a)
    {
        return Fizz(a);
    }

    T Foo<T>.Buzz(object o)
    {
        return Buzz(o);
    }

    void Foo<T>.Crackle()
    {
        Crackle();
    }
}

(私はこれを詳細に考えていませんしたがって、読み取り専用のメンバー注入、呼び出しの null チェック、抽象クラスの動作などを使用して、よりスマートなクラスを作成できると思いますが、これは私が何をするかについての一般的な考えを伝えるはずです達成したい)

これを行うことができる何かを知っている人はいますか?または、それを除けば、このようなことを行うのに最も苦労しない方法をお勧めします - これは T4 エンジンで可能でしょうか?

4

1 に答える 1

1

あなたの解決策は大丈夫です..NETでは、ほとんどの場合、メソッドをオーバーライド/実装するだけなので、匿名クラスは必要ありません. ただし、いくつかのメソッドをオーバーライド/実装する必要がある場合は、メソッドごとにデリゲートを持つスタブ クラスを作成するのが最善の方法です。WPF/Silverlight ICommand はそのように実装されています。DelegateCommand クラスは、bool CanExecute(オブジェクト パラメーター) を実装する Func と Execute(オブジェクト パラメーター) を実装する Action を受け取ります。コード生成でこれを行う最も正しい方法は、T4 テンプレートを使用してテンプレートとパラメーターを作成し (たとえば、Delegateclass を作成するクラスのクラス名を示す文字列)、リフレクションを使用してコードを生成することです。 )。

私が助けてくれることを願っています

于 2010-11-08T09:50:00.980 に答える