【问题标题】:Why do I have to specify the namespace in the parameter for assembly.GetType()?为什么我必须在 assembly.GetType() 的参数中指定命名空间?
【发布时间】:2019-02-19 14:02:29
【问题描述】:

举个例子:

var assembly = Assembly.Load("ProjA.Primates");
var myType = assembly.GetType("ProjA.Primates.Bonobo");

如果我没有指定“ProjA.Primates”。子字符串,抛出异常。

为什么在加载的程序集中找不到Bonobo类型?

【问题讨论】:

  • 可能有多个类型定义为同一个非限定名称。

标签: c# .net reflection types .net-assembly


【解决方案1】:

命名空间名称是类型全名的一部分。比如List<T>的全称是System.Collections.Generic.List<T>

在任何地方都使用全名会很不方便,因此 C# 允许您通过在源代码顶部添加 using 指令来跳过命名空间部分。然而,这只是一个编译器技巧,它将命名空间添加到位置列表中以查找类型解析。

您可以使用 LINQ 通过名称(而不是全名)查找类,如下所示:

var myType = assembly.GetTypes().SingleOrDefault(t => t.Name == "Bonobo");

注意:您的方法更严格,因为更改命名空间会导致错误。另一方面,上述方法的可预测性较差,因为您可能希望也可能不想从不同的命名空间中选择一个类。此外,如果同一个程序集中有多个具有相同短名称和不同命名空间的类,它将失败。

【讨论】:

    猜你喜欢
    • 2014-12-19
    • 2020-05-23
    • 2012-01-26
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 2020-08-07
    相关资源
    最近更新 更多