为什么我不能在泛型中使用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.GetType()

您可以使用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>()) {
...
}

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