2010-01-07 67 views
3

第一个问题在这里。 我想使用字段的类型实例化一个泛型类。在运行时使用字段类型实例化通用类

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

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

这是行不通的。有什么建议么?
在此先感谢

回答

6

这需要编译时类型,像这样:

ValueRange<int> range; 

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

+0

这其实并没有回答这个问题。看到Benjamins的答案,就是这样。 – James 2010-01-07 12:28:56

+0

詹姆斯:那么,由OP来决定什么回答这个问题:) – 2010-01-07 12:34:33

+0

“在运行时”是什么给了我 - 但我不知道,如果我正确地解析它:) – 2010-01-07 12:40:56

8

样本很混乱。我怀疑你想要类似于

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

+1,虽然它会是'typeof(ValueRange <>) 。 – 2010-01-07 12:27:50

+0

即将发布类似的东西! – James 2010-01-07 12:29:35

+0

@Mark:修正它,谢谢你。 – 2010-01-07 12:42:36

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”,但这对我来说并不好看!太复杂!!但是,如果没有更好的解决方案,我会坚持下去