通用类型在构造函数中

CSh*_*Atl 41 .net c# generics inversion-of-control

我有一个通用类型接口,并希望对象的构造函数采用通用接口.
喜欢:

public Constructor(int blah, IGenericType<T> instance)
{}
Run Code Online (Sandbox Code Playgroud)

我希望创建此对象的代码指定IGenericType(使用Inversion of Control).我还没有看到这种情况发生的方法.有什么建议可以实现吗?

我希望有人创建对象,如:

Constructor varname = new Constructor(1, new GenericType<int>());
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 50

您不能使构造函数通用,但您可以使用通用静态方法:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)
Run Code Online (Sandbox Code Playgroud)

然后在构造函数之后执行您需要的任何操作(如果需要).在某些情况下,另一种替代方案可能是引入通用接口扩展的非通用接口.

编辑:根据评论......

如果要将参数保存到新创建的对象中,并且希望以强类型方式执行此操作,则该类型也必须是通用的.

此时构造函数问题消失了,但您可能希望在非泛型类型中保留静态泛型方法:因此您可以利用类型推断:

public static class Foo
{
    public static Foo<T> CreateInstance<T>(IGenericType<T> instance)
    {
        return new Foo<T>(instance);
    }
}

public class Foo<T>
{
    public Foo(IGenericType<T> instance)
    {
        // Whatever
    }
}

...

IGenericType<string> x = new GenericType<string>();
Foo<string> noInference = new Foo<string>(x);
Foo<string> withInference = Foo.CreateInstance(x);
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,通用静态方法不允许使用对象初始化器.这无法编译:Foo.CreateInstance(x){Prop ="42"}; (2认同)