2013-07-03 4 views
1

У меня есть пространство имен:Можно ли использовать относительное пространство имен C#?

И у меня есть классы:

MyProject.Core.Db.User 
MyProject.Core.Model.User 

Можно ли что-то вроде:

using MyProject.Core; 

namespace MyProject.BLL 
{ 
    public class Logic 
    { 
     public static void DoSomething() 
     { 
      var userEntity = new Db.User(); 
      var userModel = new Model.User(); 
     } 
    } 
} 

Я просто хочу, чтобы избежать использования суффиксов в именах классов (UserModel , UserEntity).

Можно ли как-то сделать C#?

+1

Да в VB.NET :) В C# вы не можете писать IO.File.Delete(); – albert

+0

VB.NET поддерживает это, C# - нет. Ясно, что важно, чтобы вы правильно пометили свой вопрос. –

+0

Наверняка это возможно? Я просто приведу пример ниже. Вопрос гласит: «Я просто хочу избежать использования суффиксов в именах классов» _ и упоминает «новый Db.User()» (не 'new User()') и т. Д. Ему просто нужно указать пространство имен на один уровень вверх. – andreister

ответ

3

Я не понимаю, почему люди говорят, что это невозможно. Конечно, это возможно, вам просто нужно быть немного более конкретными в пространствах имен при создании целевых классов (то есть вы можете пропустить только общую часть пространства имен):

namespace MyProject.Core.Db 
{ 
    public class User 
    { 
    } 
} 

namespace MyProject.Core.Model 
{ 
    public class User 
    { 
    } 
} 

namespace MyProject.BLL 
{ 
    public class Logic 
    { 
     public static void DoSomething() 
     { 
      var foo = new Core.Db.User(); 
      var boo = new Core.Model.User(); 
     } 
    } 
} 
+1

Я думаю, он хочет 'Foo.User' вместо' Server.Foo.User'. –

+0

Нет, он сказал: «Я просто хочу избежать использования суффиксов в именах классов» - выше решает проблему. – andreister

+0

@andreister Обратите внимание, что единственный способ избежать полного имени - находиться внутри общего пространства имен с другими тремя. Если это не вариант, вы вернетесь к тому, чтобы иметь только полное имя. – Servy

3

То, чего вы пытаетесь достичь, невозможно. Ближе всего вы получите это using alias directive, который выглядит следующим образом:

using User = Myproject.Core.Db.User; 

Это устраняет необходимость в полной мере квалифицировать путь для Myproject.Core.Db.User. Тем не менее, вам все равно нужно указать полный путь для хотя бы одного из классов. Вы могли бы создать другой псевдоним для другого типа, как продемонстрировал Servy, но в этот момент я бы просто переименовал классы.

Я думаю, что реальное решение здесь - дать вашим классам более описательные идентификаторы.

+0

Если вы дали ему любой псевдоним * другой *, который 'Пользователь', вы могли бы добавить' использование' для одного пространства имен, а затем использовать псевдоним для другого. Из всех псевдонимов, которые нужно выбрать, это единственное, что не полезно. Также обратите внимание, что ситуацию не всегда можно избежать, изменяя имена, например, в BCL есть несколько классов, которые совместно используют имя в разных пространствах имен, таких как «Таймер» (который имеет немало). – Servy

+0

@Servy Tbh, который мне не приходил, так что спасибо. Но независимо от того, он мог бы просто дать классам эти идентификаторы в этом случае. –

+0

См. Edit; это не всегда вариант. – Servy

0

Вы можете добавить псевдоним для одного класса, который вы не импортировать пространство имен:

using MyProject.Core.Db; 
using ModelUser = MyProject.Core.Model.User; 

namespace MyProject.BLL 
{ 
    public class Logic 
    { 
     public static void DoSomething() 
     { 
      var userEntity = new User(); 
      var userModel = new ModelUser(); 
     } 
    } 
} 

В C# это не представляется возможным использовать пример, который показал, это просто не поддерживаемая функция.

1

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

В вашем случае это означает, что если вы находитесь в пространстве имен MyProject.Core, вы можете ссылаться на свои классы как Db.User и Model.User. Но если вы находитесь в пространстве имен MyProject.BLL, вы должны указать префикс Core (Core.Db.User и Core.Model.User).

Если это не достаточно для вас, и вы не хотите изменять структуру пространства имен, лучшим вариантом является, возможно, добавить using s ко всем файлам, использующим типы, о которых идет речь.

using DbUser = MyProject.Core.Db.User; 
using ModelUser = MyProject.Core.Model.User; 
Смежные вопросы