Как назначить объект одного класса, объявленный в 2 разных пространствах имен - PullRequest
2 голосов
/ 20 июля 2010

У меня есть проект веб-сервиса с классом (давайте назовем его webservice.classA).

У меня есть другой проект класса, создающий dll, который ссылается на этот класс в своем собственном пространстве имен и создает экземпляр его экземпляра.(давайте вызовем пространство имен dll пространство имен dll).

В другом проекте я хочу получить доступ к члену в dll

например,

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 ]

2 голосов
/ 20 июля 2010

Вы правы ... недостаток дизайна существует с точки зрения именования.

Предположим:

  • у вас есть класс с именем 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;

Таким образом, вы избежите столкновения. Также полезно использовать, если у вас есть очень длинные пространства имен.

ДОПОЛНИТЕЛЬНАЯ ССЫЛКА: (Из статьи MSDN по using Директива )

  • Область действия с использованием директивы ограничивается файлом, в котором он появляется.

  • Создайте , используя псевдоним , чтобы упростить определение идентификатора для пространство имен или тип.

  • Создайте директиву , используя , чтобы использовать типы в пространстве имен без указания пространства имен. Директива с использованием директивы не дает вам доступа ни к каким пространствам имен, вложенным в указанное вами пространство имен.

2 голосов
/ 20 июля 2010

У вас есть столкновение имен. Поддерживаемый способ избежать этого (если не называть ваши классы одинаковыми) - это определить , используя псевдоним для одного из классов:

using webservice.classA = myWebserviceClassA;
1 голос
/ 20 июля 2010

Измените строку определения копии на:

dllnamespace.webservice.classA copy = null;
0 голосов
/ 20 июля 2010

Это просто проблема - вы не можете иметь класс в более чем одном пространстве имен.Это то, для чего были разработаны пространства имен - чтобы не дать псевдонимам классов с одинаковыми именами, написанных разными людьми.Вам нужно будет выбрать одно из ваших пространств имен, чтобы иметь этот класс, а другое - импортировать его.В качестве альтернативы, если DLL и веб-служба являются частью одного и того же распределенного приложения, они должны использовать одно и то же пространство имен.

...