为什么我不能在泛型中使用Type.GetType()
本文关键字:Type GetType 不能 泛型 为什么 | 更新日期: 2023-09-27 18:02:48
我试图通过使用某些类型的字符串表示来摆脱一些引用。但是对于泛型方法,编译器不允许我按我想要的方式去做。我试过了:
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>()) {
...
}
对于第一个循环,我得到了这样的信息:"操作符'<'不能应用于'method group'和'System '类型的操作数。输入',对于第二个变量,由于某种原因,它超出了作用域。为什么会发生这种情况,有没有解决办法?
您可以使用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)))
{
//...
}
当然,这很快就会变得混乱,所以我会考虑改变你的方法。为什么不使用字符串呢?
不能在泛型类型参数的位置使用变量(在<和>)。它必须是编译时确定的类型。和>
但是在你的例子中已经是这样了。你不能直接用
foreach (var component in container.Components.OfType<MyNamespace.MyType>()) {
...
}
你想要这个:
foreach (var component in container.Components.OfType<MyNamespace.MyType>()) {
...
}
问题是你必须在泛型中使用实际的类型表达式,而不是字符串。如果确实需要使用字符串,可以使用反射来构造类型。