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()?的类型参数当然Test不必是T

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>从a 构造 a ITest<string>

或者,您的Test课程可能只需要采用一种特定的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 回答