1

私は疑いを持っています、私はそれについてたくさん検索しましたが、説明できるものは何も見つかりませんでした.

クラス内のインターフェイスを参照するプロパティを持ち、DI を使用してこれらのプロパティを埋めることができます。例えば:

public interface ITest {
    void DoSomething();
}

public class Test {
    ITest _test;

    public Test(Itest _test)
    {
        this._test = test;
    }
}

問題は、ジェネリック インターフェイスがあり、クラスがジェネリックを使用しない場合、これらのプロパティを作成するとコンパイル エラーが発生することです。

public interface ITest<T> {
    void DoSomething(T parameter);
}

public class Test {
    ITest<T> _test; //error (Type cant be found)

    public Test(Itest<T> _test)
    {
        this._test = test;
    }
}

これは可能ですか?

4

1 に答える 1

4

クラスもジェネリックである必要があります。そうしないと、変数が参照するTest種類を知る方法がありません。の呼び方をどのように知ることができますか? もちろん、型パラメータは である必要はありません:ITest<T>_test_test.DoSomething()TestT

public class Test<TFoo> {
    ITest<TFoo> _test;

    public Test(ITest<TFoo> _test)
    {
        this._test = test;
    }
}

次に、次のように構築します。

ITest<string> x = ...;
Test<string> test = new Test<string>(x);

型の安全性により、次のように書くことができなくなります。

Test<int> test = new Test<int>(x);

Test<int>からを構築できないためですITest<string>

別の方法として、Testクラスが特定の種類の を 1 つだけ取る必要があるITestため、まったくジェネリックではない場合があります。

public class Test {
    ITest<Guid> _test;

    public Test(ITest<Guid> _test)
    {
        this._test = test;
    }
}

それはすべて、達成しようとしていることに依存します。

編集: コメントに記載されているように、クラスがに依存Testする側面を使用しない場合は、非ジェネリックの基本インターフェイスを作成することをお勧めします。ITest<T>T

public interface ITest {
    void DoSomethingBland();
}

public interface ITest<T> : ITest {
    void DoSomethingSpecific(T foo);
}

次に、クラスを の代わりに非ジェネリックITestインターフェイスに依存させることができますITest<T>

于 2012-11-01T18:17:53.657 に答える