【问题标题】:.NET Multiple Namespaces for single class.NET 单个类的多个命名空间
【发布时间】:2011-04-17 20:30:54
【问题描述】:

是否可以让一个类驻留在两个命名空间中,我该怎么做?

澄清一下:我们有一个类库(假设根命名空间是 classLib1),它随着时间的推移而增长(更多类),我想在逻辑上将类分组到不同的命名空间中。 然而,一些较旧的类需要被分组到这些新的命名空间中(例如 classLib1.section1),这样做会破坏使用此类库的其他程序集中的遗留代码。所以我希望能够使用两个名称空间来引用一个类,直到我们可以逐步淘汰旧的。

我找不到这方面的任何信息,这表明人们不想这样做是有原因的!?!

【问题讨论】:

  • 为什么不正确重构并修复遗留程序集中的引用?
  • 我想,但不允许触碰其他代码 - 如果出错,就会有很多问题。
  • 那么外墙就是你的朋友。

标签: c# .net vb.net namespaces


【解决方案1】:

不,没有办法给单个类两个名称(命名空间实际上只是类名的一部分)。

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

【讨论】:

  • ...会提示为什么我找不到任何关于此的信息 - 这与名称空间如何编译为 CLR 有关吗?
  • 我曾想过创建一个外观层,但正在查看是否有更简单的解决方法。
【解决方案2】:

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

namespace classLib1.section2
{
    public myBigClass
    {

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

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

在您正确修复此问题之前作为临时修补程序。

【讨论】:

  • 这可能不适用于静态类(扩展)。我的意思是,我已经对其进行了测试,但我无法访问任何扩展方法。我还必须向命名空间添加一个虚拟类,以使其对应用程序的其余部分可见。
【解决方案3】:

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

我很确定这仅在您要分离成多个程序集时才合适/适用,但即使不是,也值得知道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2020-08-29
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2019-05-12
    相关资源
    最近更新 更多