第一个问题在这里。 我想使用字段的类型实例化一个泛型类。在运行时使用字段类型实例化通用类
public class ValueRange<type1>
{
type1 min;
type1 max;
}
void foo()
{
int k;
ValueRange<k.GetType()> range;
}
这是行不通的。有什么建议么?
在此先感谢
第一个问题在这里。 我想使用字段的类型实例化一个泛型类。在运行时使用字段类型实例化通用类
public class ValueRange<type1>
{
type1 min;
type1 max;
}
void foo()
{
int k;
ValueRange<k.GetType()> range;
}
这是行不通的。有什么建议么?
在此先感谢
这需要编译时类型,像这样:
ValueRange<int> range;
这也是值得注意的是,你通常命名类型的“T”;这只是普遍接受的标准(因此很好阅读)。
样本很混乱。我怀疑你想要类似于
Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
Activator.CreateInstance(genericType);
+1,虽然它会是'typeof(ValueRange <>) 。 – 2010-01-07 12:27:50
即将发布类似的东西! – James 2010-01-07 12:29:35
@Mark:修正它,谢谢你。 – 2010-01-07 12:42:36
你可以在运行时实例化类型,但是你不能像你在做的那样声明变量。
Type genericType = typeof(ValueRange<>).MakeGenericType(k.GetType());
object instance = Activator.CreateInstance(genericType);
当涉及到泛型类型的协变和逆变时,.NET 4.0有了新的规则。这应该有助于更强大地键入变量。
编辑:为了便于阅读,更改了示例代码以使用帮助变量genericType
。
为了更清楚。在上面的例子中,ValueRange是我的课程,而不是c#课程。
我想知道是否有任何方法可以避免声明两次类型。
int k;
ValueType m;
在这个声明中,类型“int”被声明了两次。但这在我看来是多余的。例如,如果我想改变k的类型,我将不得不更改这两个声明。我知道“Activator.CreateInstance”,但这对我来说并不好看!太复杂!!但是,如果没有更好的解决方案,我会坚持下去
这其实并没有回答这个问题。看到Benjamins的答案,就是这样。 – James 2010-01-07 12:28:56
詹姆斯:那么,由OP来决定什么回答这个问题:) – 2010-01-07 12:34:33
“在运行时”是什么给了我 - 但我不知道,如果我正确地解析它:) – 2010-01-07 12:40:56