Одинаковые имена классов в разных пространствах имен - как получить доступ к классу через непосредственное родительское пространство имен? - PullRequest
0 голосов
/ 11 июня 2018

Представьте, что у меня есть следующая структура пространства имен:

- components
--- x
----- [MyComponent]
----- [YourComponent]
--- y
----- [MyComponent]
----- [YourComponent]

MyComponent и YourComponent - это классы в пространствах имен x и y.

Насколько я понимаю, я смогу получить доступ к нужному классу с помощью using components; и получить к ним доступ через x.MyComponent и y.MyComponent.Однако, похоже, это не так, и я должен использовать более длинное имя пространства имен: components.x.MyComponent.

Есть ли решение, которое позволило бы мне использовать следующее непосредственное пространство имен в иерархии (например,x или y) чтобы различать классы, а не «полное» или «более длинное» имя пространства имен (например, component.x и components.y)?

PS: я знаюпроблемы, связанные с совместным использованием имен классов

Edit: Извинения, я хотел бы знать, есть ли решение, которое не требует использования псевдонимов (если это возможно), если оно не предоставляет обходной путь, который позволяетмне указать x.MyComponent

Ответы [ 3 ]

0 голосов
/ 11 июня 2018

Мы можем использовать псевдонимы пространства имен, чтобы избежать длинных пространств имен.

например

using compX = components.x;
using compY = components.y;

Теперь мы можем различать один и тот же класс, присутствующий в разных пространствах имен, с помощью псевдонима пространства имен

Как

  compX.MyComponent  //This will refer to MyComponent class from x namespcae

Для более подробной информации: SO-Thread

0 голосов
/ 11 июня 2018

У вас есть несколько вариантов здесь.Вы можете:

A) Использовать псевдоним для класса:

using MyXComponent = components.x.MyComponent;
...
new MyXComponent();

B) Добавить использование для одного из этих пространств имен, которое содержит класс (без псевдонима):

using components.x;
...
new MyComponent(); // will create an x.MyComponent

C) Объединить оба подхода:

using x = components.x;  
using y = components.y;  
...
new x.MyComponent();
new y.MyComponent();

PS

Компилятору необходимо знать, какой из двух классов вы ищете, и находит ли он два класса с одинаковымиname в пространствах имен, включенных в директивы using, выдает ошибку времени компиляции "xx - это неоднозначная ссылка между этим и этим".Использование псевдонимов позволяет нам помочь компилятору различать их.

0 голосов
/ 11 июня 2018

У меня лично нет классов с одинаковыми именами, однако вы можете использовать директивы псевдонимов C # 6

// Using alias directive for a classes
using MyComponentX = components.x.MyComponent;
using MyComponentY = components.y.MyComponent;

Использование

MyComponentX instance1 = new MyComponentX();

Или еслиони достаточно похожи для одного и того же имени, может быть, дженерики?

Дополнительное чтение

с использованием директивы (C # Reference)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...