快速理论问题。我有以下代码:
if (partnership != null && partnership.UseCustomNotifier)
{
//some behavior
}
else
{
Integration.Protocol.Client.Notifier protocolNotifier = new Integration.Protocol.Client.Notifier();
}
我有两种使用反射的伙伴关系实现方式。 Integration.Protocol 不在使用中。实现应动态选择;问题是,如果我评论最后一行(protocolNotifier的实例化),它将仅选择一个实现(该实现不是来自 Integration.Protocol ,因为这是唯一可用的实现)。否则,将使用反射来动态选择它。
我知道这段代码很烂(我已经对其进行了改进),但是我很好奇为什么会发生这种行为。我猜想,当解决方案在运行之前进行编译时,它将检查在哪一行实例化了protocolNotifier并在编译时添加了using。它是否正确?它仅在方法范围内发生吗?还是全班?我对.NET编译器在这种情况下的工作方式感到好奇。
答案 0 :(得分:0)
如果我对您的理解正确:
partnership
是一种类型的对象,通过使用反射来查找具有该名称的所有可用类(我们将其称为Partnership
)并创建找到的类型的对象来选择Integration.Protocol
命名空间有一个名为Partnership
的类(或其实际调用的名称),但是在该项目的代码或您所使用的其他库中还有另一个名为Partnership
的类已经在其他地方使用了如果我是对的,那么我相信您看到的行为仅是因为它正在加载Integration.Protocol
库(假设这是一个单独的DLL,实际上不是当前项目代码的一部分)。
如果您向我们展示如何设置partnership
的代码,那么我们可以确认这一点。但是,如果我是正确的话,那么如果您在最后一行中不使用Integration.Protocol
,那么该库就不会被加载,并且您的反射代码也不会从该库中找到任何内容。
不是“在编译时添加using
”,因为using
语句仅允许您在引用类时不包括名称空间。与是否在运行时加载库无关。