Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用全名实例化对象_C#_Asp.net_.net_Visual Studio_Compilation - Fatal编程技术网

C# 用全名实例化对象

C# 用全名实例化对象,c#,asp.net,.net,visual-studio,compilation,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(); } 我有两个使用反射选择的伙伴关系实现集成。协议不在使用中

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

if (partnership != null && partnership.UseCustomNotifier)
{
    //some behavior
}
else
{
    Integration.Protocol.Client.Notifier protocolNotifier = new Integration.Protocol.Client.Notifier();
}   
我有两个使用反射选择的伙伴关系实现集成。协议不在使用中。实施应动态选择;问题是,如果我评论最后一行(protocolNotifier的实例化),它将只选择一个实现(不是来自Integration.Protocol,因为它是唯一可用的实现)。否则,将使用反射动态选择它


我知道这段代码很糟糕(我已经改进了),但我很好奇为什么会出现这种行为。我猜,当解决方案在运行之前编译时,它会检查protocolNotifier被实例化的那一行,并在编译时添加using。这是正确的吗?它是否只发生在方法的范围内?还是整个班级?我很好奇.NET编译器在这些情况下是如何工作的。

如果我理解正确:

  • partnership
    是一个类型的对象,通过使用反射查找具有该名称的所有可用类(我们称之为
    partnership
    )并创建所找到类型的对象,可以选择该类型的对象
  • Integration.Protocol
    名称空间有一个名为
    Partnership
    的类(或者不管它实际被称为什么),但是在这个项目的代码或其他一些库中也有另一个名为
    Partnership
    的类,您已经在其他地方使用过了
  • 根据是否包含最后一行,反射代码选择其中一行
如果我在这方面是正确的,那么我相信您看到的行为仅仅是因为它正在加载
Integration.Protocol
库(假设它是一个单独的DLL,而不是当前项目代码的一部分)

如果您向我们展示您如何设置
合作关系的代码,那么我们可以对此进行确认。但如果我是正确的,那么如果您在最后一行中没有使用
Integration.Protocol
,那么该库就不会被加载,您的反射代码也不会从该库中找到任何内容


这并不是说“在编译时使用
添加
”,因为
使用
语句只允许在引用类时不包含名称空间。它与库是否在运行时加载没有任何关系。

您所说的“动态”是什么意思。您显示的代码中没有任何反射,但代码看起来确实像工厂方法/类。该类不再可用,因为您已将其从方法中删除(我假定)。我想我的意思是,你发布的代码与你的问题不匹配。您想在这里实现什么?它不会在编译时使用
添加
使用
只是为了避免您每次都必须键入完全限定的名称。编译的IL代码使用完全限定名。看看你的IL代码,自己看看