C#创建包装器命名空间?

时间:2017-04-17 19:13:46

标签: c# dll namespaces

在C#中,如何将所有类从一个名称空间导入另一个名称空间,以便可以从第二个名称空间直接访问这些类?

我实际上是在尝试以外部可见的方式重命名命名空间。

因为代码值得千言万语,所以给定一个带有以下命名空间的DLL:

// Externally written DLL I have no control over.

namespace A
{
    class ClassA {...}
}

我希望能够创建另一个DLL:

// My DLL

namespace Wrapper
{
    using A;
}

所以我可以像以下一样使用它:

// Final C# program.

using Wrapper;

var a = ClassA();

在python中,我可以用import *完成我想要的东西:

# external.py
class ClassA:
    ...
# mymodule.py
from external import *
# final_program.py
import mymodule
a = mymodule.ClassA()

声明

我知道这是一个可怕的想法,但遗憾的是我受到外部要求的限制。简短的版本是我有一个外部DLL需要与专有系统接口(EnScript,如果你很好奇)。这个专有系统对外部DLL当然违反命名空间的命名有限制。因此,我试图使用包装器DLL来公开被认为有效的命名空间。

相关问题

在java / python中谈论C#中的using与通配符导入。不解决从第二个命名空间访问的问题:

关于在命名空间中包含类的问题。问题是使用单独的项目,因此不适用于这个问题:

1 个答案:

答案 0 :(得分:0)

您无法将类型移动到其他命名空间(除了物理移动代码之外)。 .NET类型系统使用完整命名空间来唯一标识类型。

但是你可以创建一个别名来掩盖原始命名空间。

假设您有一个班级MyProject.Foo.Bar.Xyzzy.MyClass,而您厌倦了输入MyProject.Foo.bar.Xyzzy。您可以在代码文件的顶部添加Using指令,如下所示:

Using DifferentNamespace = MyProject.Foo.Bar.Xyzzy;

完成此操作后,您只需

即可参考该课程
var c = new DifferentNamespace.MyClass();

您甚至可以使用它在当前默认命名空间中包含不同的命名空间。这将编译:

namespace Example.Classes
{
    class MyClass
    {
    }
}

namespace Example
{
    using Example = Example.Classes;
    class Test
    {
        static void Test1()
        {
            var c = new Example.MyClass();  //Not Example.Classes.MyClass
        }
    }
}

但不幸的是你必须把别名留在那里;即,这不会编译:

namespace Example.Classes
{
    class MyClass
    {
    }
}

namespace Example
{
    using Example = Example.Classes;
    class Test
    {
        static void Test1()
        {
            var c = new MyClass();  //Error
        }
    }
}