我试图通过使用某些类型的字符串表示来摆脱一些引用。但是编译器不允许我按照通用方法的方式进行操作。我试过这个:
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'类型的操作数,对于第二个变量超出范围由于某种原因。为什么会发生这种情况并且有办法解决它?提前感谢。
答案 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>()) {
...
}
问题是你必须在泛型中使用实际的类型表达式,而不是字符串。如果确实需要使用字符串,可以使用反射构造类型。