用全名实例化对象

时间:2019-12-05 17:29:06

标签: c# asp.net .net visual-studio compilation

快速理论问题。我有以下代码:

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编译器在这种情况下的工作方式感到好奇。

1 个答案:

答案 0 :(得分:0)

如果我对您的理解正确:

  • partnership是一种类型的对象,通过使用反射来查找具有该名称的所有可用类(我们将其称为Partnership)并创建找到的类型的对象来选择
  • Integration.Protocol命名空间有一个名为Partnership的类(或其实际调用的名称),但是在该项目的代码或您所使用的其他库中还有另一个名为Partnership的类已经在其他地方使用了
  • 根据您是否包含最后一行,您的反射代码会选择一个或另一个

如果我是对的,那么我相信您看到的行为仅是因为它正在加载Integration.Protocol库(假设这是一个单独的DLL,实际上不是当前项目代码的一部分)。

如果您向我们展示如何设置partnership的代码,那么我们可以确认这一点。但是,如果我是正确的话,那么如果您在最后一行中不使用Integration.Protocol,那么该库就不会被加载,并且您的反射代码也不会从该库中找到任何内容。

不是“在编译时添加using”,因为using语句仅允许您在引用类时不包括名称空间。与是否在运行时加载库无关。