在运行时使用字段类型实例化泛型类

3

首先是一个问题。 我正在尝试使用字段的类型来实例化一个泛型类。

public class ValueRange<type1>
{
    type1 min;
    type1 max;
}

void foo()
{
    int k;
    ValueRange<k.GetType()> range;  
}

这行代码不起作用。有什么建议吗?
提前谢谢。

4个回答

8
样本有些困惑。我怀疑您想要类似于以下的东西:
Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
Activator.CreateInstance(genericType);

正准备发表相似的内容! - James

6
它需要一个编译时类型,如下所示:
ValueRange<int> range;

值得注意的是,你通常会将你的类型命名为“T”,这只是普遍认可的标准(因此易于阅读)。

这实际上并没有回答问题。请看本杰明的回答,那个回答才是正确的。 - James
詹姆斯:好的,让提问者决定哪个答案最合适 :) - Noon Silk
“在运行时”是让我意识到的关键点 - 但我还不确定我是否正确解析了它 :) - Benjamin Podszun
本杰明:是啊,但他似乎是个新手,这是一个经典的泛型问题,我想 :) 不过,让我们看看…… 下注 - Noon Silk

1

你可以在运行时实例化类型,但你不能像你现在这样声明变量。

Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
object instance = Activator.CreateInstance(genericType);

.NET 4.0 在泛型类型的协变和逆变方面有了新规则。这将有助于更强类型化您的变量。

编辑:为了可读性,已更改示例代码以使用辅助变量genericType


1
为了更清晰明了,上面的例子中ValueRange是我的类,而不是c#的类。
我想知道是否有任何方法可以避免重复声明类型。
int k;
ValueType m;

在这个声明中,“int”类型被声明了两次。但是我认为这似乎是多余的。例如,如果我想要更改k的类型,我必须更改两个声明。我知道“Activator.CreateInstance”,但这对我来说看起来不太好!太复杂了!!但是如果没有更好的解决方案,我会坚持使用它。

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