为什么我不能在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构造类型。