利用调用命名空间

时间:2018-01-05 18:11:06

标签: c# .net

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

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 个答案:

答案 0 :(得分:1)

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

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

MSDN有关于性能的以下说明:

  

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

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