【问题标题】:C# creating a wrapper namespace?C# 创建一个包装命名空间?
【发布时间】:2017-09-13 10:54:56
【问题描述】:

在 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 来公开一个被认为有效的命名空间。

相关问题

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

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

【问题讨论】:

  • 我最初建议你使用类型转发,但是在运行了一个小测试模型之后,这对你不起作用,因为一个要求是命名空间保持不变,这是你不能拥有的。看起来您最好的选择是创建 shell 类,将请求转发到另一个程序集中的真实类。

标签: c# dll namespaces


【解决方案1】:

您不能将类型移动到不同的命名空间(除了物理移动代码)。 .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
        }
    }
}

【讨论】:

  • 我可以从Example 命名空间之外访问别名吗?因为这是我不幸需要做的。
  • 您可以在任何代码模块中访问它,只需将using Example = Example.Classes 与其他 using 指令一起放在顶部。
  • 问题是,我最终是从专有脚本引擎访问,而不是 C#。这个专有的脚本引擎可以调用 .NET DLL,但实际上并不在 .NET 中运行。 (这很复杂,但不幸的是,由于业务需求,我不得不使用它。)
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
相关资源
最近更新 更多