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代码,自己看看