为什么我不能在泛型中使用Type.GetType()?

时间:2011-07-19 07:01:29

标签: c# generics

我试图通过使用某些类型的字符串表示来摆脱一些引用。但是编译器不允许我按照通用方法的方式进行操作。我试过这个:

IContainer container = components as IContainer;
Type type = Type.GetType("MyNamespace.MyType");
foreach (var component in container.Components.OfType<Type.GetType("MyNamespace.MyType")>()) {
    ...
}

而且:

foreach (var component in container.Components.OfType<type>()) {
    ...
}

对于第一个循环,我得到了这个:“运算符”&lt;'不能应用于'方法组'和'System.Type'类型的操作数,对于第二个变量超出范围由于某种原因。为什么会发生这种情况并且有办法解决它?提前感谢。

3 个答案:

答案 0 :(得分:5)

您可以使用Type.MakeGenericType。例如:

Type.GetType("YourGenericType").MakeGenericType(Type.GetType("yourTypeParameter"))

具有由字符串确定的类型参数的List的示例:

typeof(List<>).MakeGenericType(Type.GetType("System.String"))

这与

相同
typeof(List<string>)

但您仍然无法使用Type实例来调用Enumerable.OfType。你可以使用这样的东西:

foreach (var component in container.Components.Where(o => o.GetType().IsAssignableFrom(yourType))) 
{
    //...
}

当然,这很快就会变得混乱,所以我会考虑改变你的做法。为什么你不想使用字符串?

答案 1 :(得分:2)

您不能在泛型类型参数的位置使用变量(在&lt;和&gt;之间)。它必须是在编译时确定的类型。

但在你的例子中,情况已经如此。你不能只使用

foreach (var component in container.Components.OfType<MyNamespace.MyType>()) {
...
}

答案 2 :(得分:0)

你想要这个:

foreach (var component in container.Components.OfType<MyNamespace.MyType>()) {
...
}

问题是你必须在泛型中使用实际的类型表达式,而不是字符串。如果确实需要使用字符串,可以使用反射构造类型。