【问题标题】:Why I cannot use Type.GetType() in generics?为什么我不能在泛型中使用 Type.GetType()?
【发布时间】:2011-07-19 07:01:28
【问题描述】:

我试图通过使用某些类型的字符串表示来摆脱一些引用。但是在泛型方法的情况下,编译器不会让我按照我想要的方式去做。我试过这个:

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>()) {
    ...
}

对于第一个循环,我得到这个:“运算符'

【问题讨论】:

    标签: c# generics


    【解决方案1】:

    您可以使用 Type.MakeGenericType。示例:

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

    类型参数由字符串确定的列表示例:

    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))) 
    {
        //...
    }
    

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

    【讨论】:

    • 我应该用什么代替“yourTypeParameter”?什么样的参数?
    • 好吧,例如,如果你有一个 List,那么 int 就是类型参数。
    • 我仍然无法得到它。同样的例外......顺便说一句,我试图代表的类型不是通用的。我说的泛型只是 OfType() 方法。
    • 哦,我没听懂你的问题。我以为您在谈论通用类型,而不是方法。查看我的更新。
    • 您可以在 OfType/Cast 中指定“对象”,然后在生成的 IEnumerable 上使用 LINQ,例如:container.Components.Cast().Where(o => o.GetType()。 IsAssignableFrom(yourType))).
    【解决方案2】:

    您不能使用变量代替泛型类型参数(在 之间)。它必须是在编译时确定的类型。

    但在您的示例中,情况已经如此。你不能用吗

    foreach (var component in container.Components.OfType<MyNamespace.MyType>()) {
    ...
    }
    

    【讨论】:

    • 我不能,但我不想这样做,因为我不想添加对该命名空间的引用。很多原因。第一个:老板说... :)
    • 但如果您不添加引用,则无法使用该类型。除非您在运行时加载程序集...
    【解决方案3】:

    你想要这个:

    foreach (var component in container.Components.OfType<MyNamespace.MyType>()) {
    ...
    }
    

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

    【讨论】:

    • 他不知道。他想做到这一点,而不是直接在代码中说明类型,而是使用带有类型名称的字符串。当然,这不是一个很好的主意,但这是他想要的……
    • 如何使用反射构造类型?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-16
    • 2012-08-27
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-10
    • 1970-01-01
    相关资源
    最近更新 更多