我试图更详细地理解反思。我正在开发的项目旨在成为一个由多个开发人员使用的内部包。问题是,我们解析了来自不同部门的大量数据。对于具有不同标题,排序以及标题中名称的缩写的文档。
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
我传递命名空间而不是程序集时。这让我想到了我希望理解的问题的根源。如何成功使用该命名空间?如何加载内部属性?
答案 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()
仍然有效(并且不需要与类名称耦合)。