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

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

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

还有这个:

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

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

您可以使用Type.MakeGenericType。 例:

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

具有由字符串确定的typeparameter的List的示例:

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

这给你一样的

 typeof(List) 

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

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

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

您不能在generics类型参数的位置使用变量(在<和>之间)。 它必须是在编译时确定的类型。

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

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

你要这个:

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

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