如何分配在2个不同名称空间中声明的相同类对象

时间:2010-07-19 21:27:27

标签: c# class namespaces

我有一个带有类的webservice项目(让我们将其称为webservice.classA)。

我有另一个类项目生成一个dll,它在自己的命名空间中引用该类并实例化它的一个实例(让我们调用dll命名空间dllnamespace)。

在另一个项目中,我想访问dll中的成员

e.g。

using webservice;

namespace other_project
{
    class B
    {
        classA copy = null;
        //....
        dllnamespace.dostuff(); // amongst other things instantiates a classA object
        //....
        copy = dllnamespace.getclassA(); // method to return classA member

我得到的编译器错误无法将类型从dllnamespace.webservice.classA转换为other_project.webservice.classA

我想我有一个基本的设计缺陷,但我认为必须有(?)一种在多个命名空间中声明/使用“webservice.classA”的方法。

4 个答案:

答案 0 :(得分:2)

你有一个名字冲突。避免这种情况的支持方式(没有将类命名为相同)是为其中一个类定义using alias

using webservice.classA = myWebserviceClassA;

答案 1 :(得分:2)

你是对的......在命名方面确实存在设计缺陷。

让我们假设:

  • 你有一个名为的班级 MyClass

  • 该类在命名空间中存在 两者 - abc.xyz.qwe.tyu.MyClass

  • 并在命名空间中 - sed.qwe.dfg.ert.MyClass

解决方法是 -

using NS1 = abc.xyz.qwe.tyu.MyClass;
using NS2 = sed.qwe.dfg.ert.MyClass;

这样可以避免冲突。 此外,如果您有很长命名空间,也很有用。

进一步参考:(来自using Directive上的MSDN文章)

  • 使用指令的范围是 限于它所在的文件 出现。

  • 创建使用别名,以便更轻松地将标识符限定为a 命名空间或类型。

  • 创建 using 指令以使用命名空间中的类型,而无需指定命名空间。 using 指令不允许您访问嵌套在指定名称空间中的任何名称空间。

答案 2 :(得分:1)

将复制定义行更改为:

dllnamespace.webservice.classA copy = null;

答案 3 :(得分:-1)

这就是问题所在 - 你不能在一个以上的命名空间中拥有一个类。这就是名称空间的设计目的 - 防止不同人编写的具有相同名称的类别出现别名。您需要决定一个名称空间来拥有该类,而在另一个名称空间中导入它。或者,如果dll和Web服务是同一个分布式应用程序的一部分,那么它们应该使用相同的命名空间。