构造函数中的泛型类型

61

我有一个泛型类型接口,想要一个对象的构造函数接受这个泛型接口。

例如:

public Constructor(int blah, IGenericType<T> instance)
{}

我希望创建该对象的代码能够指定IGenericType (使用控制反转)。我还没有找到实现这一点的方法。有什么建议可以实现吗?

我希望有人可以像下面这样创建对象:

Constructor varname = new Constructor(1, new GenericType<int>());
1个回答

74

你无法使构造函数成为通用的,但是你可以使用一个通用的静态方法代替:

public static Constructor CreateInstance<T>(int blah, IGenericType<T> instance)

如果需要在构造函数之后执行任何其他操作,则可以进行此操作,如果必要的话。在某些情况下,另一种选择可能是引入一个非泛型接口,该接口扩展泛型接口。

编辑:根据评论...

如果您想以强类型方式将参数保存到新创建的对象中,则类型也必须是泛型类型。

这时候构造函数的问题就解决了,但是您可能仍希望在非泛型类型中保留一个静态的泛型方法:这样您就可以利用类型推断功能:

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);

1
如果您需要将其作为成员变量强类型化,则应使整个类型通用化,然后构造函数问题就会消失。 - Jon Skeet
3
很不幸,通用的静态方法无法使用对象初始化器。下面这行代码会编译错误:Foo.CreateInstance(x) { Prop = "42" }; - Bruno Martinez
@Bruno:确实......那绝对是不幸的 :( - Jon Skeet
@JonSkeet 你们在谈论的 IGenericType 是什么?我正在运行一个旧版本的 .net,它没有包含在内(我想是这样的)? - jordan
@jordan.peoples:它不是任何特定类型 - 它只是一个通用接口的示例,具有GenericType<T>的具体实现。 - Jon Skeet
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接