代码之家  ›  专栏  ›  技术社区  ›  Greg

利用调用命名空间的类库

  •  -1
  • Greg  · 技术社区  · 8 年前

    我试图更详细地理解反射。我正在处理的项目是一个内部包,由多个开发人员使用。问题是,我们分析了来自不同部门的大量数据。对于具有不同标题、顺序以及标题中名称的缩写的文档。

    Example: (Delimited Example)
    Department A : 
                    Date,          Volume, Depth,     Turbidity
                    Date and Time, Volume, Turbidity, Depth
                    Date,          Vol.,   Turb.,     Dep.
                    Date,          NTU,    Vol,       Dep ft
    
    Department B:
                    Date/Time,     Flow,   Level,     Velocity
                    Timestamp,     Lvl,    Flow,      Vel. 
    

    所以在库中,我想包含一个映射文件,其中包含一个本质上可以调用的方法 GetHeaderConfigurations . 任何引用此库的人都可以使用用户友好的名称调用库,但会传递包含特定信息的对象。

    重要的部分是它们的对象和名称空间。我将递归类的名称空间,这些类是关于文件头的详细信息。

    问题是:

    public static IEnumerable<Type> GetHeaderConfiguration(FileConfiguration configuration)
    {
         var assembly = Assembly.Load(configuration.HeadersNamespace);
         // Some more code
    }
    

    当我从引用库的另一个应用程序调用它时,我并没有收到所有的类。应用程序构建对象,然后按以下方式存储名称空间 "Sample.Headers.LabConfiguration" . 我执行以下操作:

    var headers = Assembly.GetExecutingAssembly()
                           .GetTypes()
                           .Where(t => t.IsClass && t.Namespace == "Sample.Headers");
    

    以上内容确实返回了解决方案中目录中的所有类,但由于某种奇怪的原因,当我尝试加载程序集时,代码失败了。

    我想问题是我打电话的时候 Assembly.Load 我传递的是名称空间,而不是程序集。这让我找到了我希望理解的问题的根源。如何成功使用该命名空间?如何加载内部属性?

    1 回复  |  直到 8 年前
        1
  •  1
  •   TypeIA    8 年前

    Assembly.Load() 为此,加载一个新程序集(粗略地说,是一个DLL或EXE)。如果只想在当前程序集中查找类,请使用 Assembly.GetExecutingAssembly() 获取当前正在执行的 Assembly 对象,然后调用 GetTypes() 在那上面。

    var assembly = Assembly.GetCurrentlyExecutingAssembly();
    var headers = assembly.GetTypes().Where(...);
    

    MSDN对性能有以下说明:

    出于性能原因,只有在设计时不知道当前正在执行的程序集时,才应该调用此方法。检索表示当前程序集的程序集对象的建议方法是使用类型。在程序集中找到的类型的程序集属性,如下例所示。

    除非您在紧密循环中多次运行此代码,否则在我看来,没有理由担心性能。但如果您想遵循MSDN的建议,您可以替换 装配GetExecutingAssembly() 具有 typeof(ThisClass).Assembly 哪里 ThisClass 包含代码的类的名称。但是 装配GetExecutingAssembly() 仍然有效(并且不需要与类名耦合)。