不同命名空间中的类

时间:2013-07-11 11:03:21

标签: c# .net namespaces

我正在使用第三方dll。我在某个命名空间namespace.class中使用了一个类。

在较新的版本中,该类已被移动到另一个名称空间中,因此它现在为newnamespace.newpart.class。我的代码需要支持这两种情况。我该如何解决这个问题?

6 个答案:

答案 0 :(得分:3)

如果一个类存在于两个名称空间中,则它不是同一个类。这是两个不同的类别。

有很多方法可以“支持”不同的课程,但这完全取决于你的实施,即“支持两种情况”的含义。

答案 1 :(得分:2)

我的第一个建议是确保您的代码库使用相同的程序集,因此重构您的代码以使其一致并使用较新的版本 - 然后整个问题就消失了。

如果这不合适,那么根据使用的版本,您必须在文件中对其进行别名,例如:

旧版.cs文件:

using ThirdPartyClass = ThirdPartyNamespace1.Class

较新的.cs文件:

using ThirdPartyClass = ThirdParty.OtherNameSpace.Class

注意,您可能会遇到问题,具体取决于旧版本和新版本之间的兼容性。你真的应该考虑选项1.并且“我不想在我的代码中改变它”的借口不是借口(我不是在推断它,只是说:))

答案 2 :(得分:2)

开发第三方dll的后期绑定并检查它是哪个版本。您可以在正确的命名空间中创建正确对象的新实例。

这里有一些示例代码:

//load dll
System.Reflection.Assembly myDllAssembly =
    System.Reflection.Assembly.LoadFile("myspeciallibrary.dll");

//create object
Object MyDLLObjectInstance;

//initialize object
if (myDllAssembly.ImageRuntimeVersion == "version2")
{
    MyDLLObjectInstance = (Object)myDllAssembly.CreateInstance("MyDLLNamespace.MyDLLObject");
}
else
{
    MyDLLObjectInstance = (Object)myDllAssembly.CreateInstance("MyDLLNamespace.NewNameSpace.MyDLLObject");
}

答案 3 :(得分:0)

目前,当您的应用程序链接时,必须知道名称空间。所以你不能以同样的方式编写支持两个不同dll的应用程序。

因此编译后无法更改dll。

如果有一个或另一个类可用,您可以尝试处理代码以使用不同的类。

答案 4 :(得分:0)

您可以使用MEF的方法之一。在单独的程序集中编写两个适配器类/ MEF对象,检查您拥有的第三方库并加载适当的适配器类。

答案 5 :(得分:-1)

假设该类是唯一的(即它已完全从namespace.class移动到namespace.newpart.class,您可以只包含两个名称空间......

这应该编译,但是在运行时如果库被换出它就不会工作......