.NET单个类的多个命名空间

22

一个类能否同时存在于两个命名空间中,如何实现这一点?

为了澄清:我们有一个类库(假设根命名空间是classLib1),随着时间的推移它变得越来越大(添加了更多的类),我想将类逻辑分组到不同的命名空间中。然而,一些旧的类需要被分组到这些新的命名空间中(例如classLib1.section1),这样做会破坏其他使用该类库的程序集中的遗留代码。因此,在我们逐步淘汰旧代码之前,我希望能够同时使用两个命名空间来引用一个类。

我找不到任何关于这个问题的信息,这表明人们不想这样做有很好的理由!?!


1
为什么不彻底重构并修复遗留程序集中的引用呢? - Kirk Woll
我想去操作,但是不被允许触碰其他的代码——如果出现错误,太多的东西都会受到影响。 - Mr Shoubs
1
然后,facade 是你的朋友。 - annakata
3个回答

24

不,无法为单个类指定两个名称(命名空间实际上只是类名的一部分)。

作为解决方法,您可以将类移动到新位置,并在旧位置创建围绕它们的薄包装器(外观模式)。当然,更好的解决方案是将类移动并相应地修复遗留代码。


为什么我找不到关于这个的任何信息 - 这与命名空间如何编译到CLR有关吗? - Mr Shoubs
我曾考虑过创建一个外观层,但是正在寻找是否有更简单的解决方法。 - Mr Shoubs

5

类型转发是在.net 2.0中引入的,这意味着您可以使用TypeForwardedToAttribute属性来指示最初存在于AssemblyX中的类型现在应在AssemblyY中找到。

我相当确定只有在将其分成多个程序集时才适用/适用,但即使不是如此,也值得知道。


4

作为一种解决方法,当您需要时,可以将该类“using”到第二个命名空间中:

namespace classLib1.section2
{
    public myBigClass
    {

在旧命名空间中使用它的每个文件中,您可以添加一行代码

namespace classLib1.section1
{
    using myBigClass = classLib1.section2.myBigClass;

作为一种临时修补,直到您完全解决这个问题。

这可能无法与静态类(扩展)一起使用。我的意思是,我已经测试过了,但我无法访问任何扩展方法。我还不得不添加一个虚拟类到命名空间中,以使其对应用程序的其余部分可见。 - jahu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接