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

时间:2010-01-07 12:22:36

标签: c# generics

这里的第一个问题。 我试图使用字段的类型来实例化泛型类。

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

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

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

4 个答案:

答案 0 :(得分:8)

样本令人困惑。我怀疑你想要像

这样的东西
Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
Activator.CreateInstance(genericType);

答案 1 :(得分:6)

需要编译时类型,如下所示:

ValueRange<int> range;

值得注意的是,您通常将您的类型命名为“T”;它只是普遍接受的标准(因此很好阅读)。

答案 2 :(得分:1)

您可以在运行时实例化该类型,但不能像处理那样声明变量。

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

.NET 4.0在涉及泛型类型的协方差和逆变时有新的规则。这应该有助于更强烈地键入您的变量。

编辑:更改了示例代码以使用辅助变量genericType以提高可读性。

答案 3 :(得分:1)

使其更清晰。在上面的示例中,ValueRange是我的类,而不是c#one。

我想知道是否有办法避免两次声明类型。

int k;
ValueType m;

在此声明中,类型“int”被声明两次。但在我看来,这似乎是多余的。例如,如果我想更改k的类型,我将不得不更改两个声明。我知道“Activator.CreateInstance”,但这对我来说并不好看!太复杂!!但如果没有更好的解决方案,我会坚持下去