2010-07-26 13 views
14

To może być ignoranckie pytanie, ale nie jestem pewien, dlaczego nie mogę używać metod aliasowania i rozszerzania przestrzeni nazw.Dlaczego metody rozszerzeń nie działają w przypadku aliasingu przestrzeni nazw?

Poniższy przykład działa dobrze:

Program.cs

using System; 
using ExtensionMethodTest.Domain; 

namespace ExtensionMethodTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var m = new Domain.MyClass(); 
      var result = m.UpperCaseName(); 
     } 
    } 
} 

MyClass.cs

using System; 

namespace ExtensionMethodTest.Domain 
{ 
    public class MyClass 
    { 
     public string Name { get; set; } 
    } 
} 

MyClassExtensions.cs

using System; 

namespace ExtensionMethodTest.Domain 
{ 
    public static class MyClassExtensions 
    { 
     public static string UpperCaseName (this MyClass myClass) 
     { 
      return myClass.Name.ToUpper(); 
     } 
    } 
} 

Jednak, kiedy alias domeny w następujący Program.cs:

using Domain = ExtensionMethodTest.Domain; 

Metoda rozszerzenie nie działa ..

To może być dość frustrujące, kiedy mam do czynienia z konwersji różnych obiekty domeny do obiektów kontraktowych (powiedzmy, że mam 4 zespoły domen i 4 zespoły kontraktowe) do użytku w usłudze sieci Web. Korzystanie aliasing byłby bardzo przydatny, jak mogłem alias w następujący sposób i nadal korzystać z różnych metod rozszerzenie (takie jak ToContract, etc.):

using BillingContracts = Namespace.Billing.Contracts; 
using IssuingContracts = Namespace.Issuing.Contracts; 

etc ...

czekam na odpowiedź .. Jestem pewien, że to proste, ale ja, przez całe życie, nie mogę zrozumieć, dlaczego to nie działa.

Dzięki!

+2

To dobre pytanie. Nie jestem pewien dokładnej odpowiedzi, ale prawdopodobnie ma to związek z tym, że metoda rozszerzenia jest powiązana z typem * rozszerzenia *, a nie z jego * obszarem nazw *. W związku z tym sam typ musi być widoczny w klasie, więc nadal musisz dołączyć pełną instrukcję 'using'. –

Odpowiedz

10

Upewnij się, że jeszcze dodać non-aliased użyciu klauzuli:

Program.cs

using System; 
using ExtensionMethodTest.Domain; //DON'T FORGET A NON-ALIASED USING 
using MyDomain = ExtensionMethodTest.Domain; 

namespace ExtensionMethodTest 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var m = new MyDomain.MyClass(); 
      var result = m.UpperCaseName(); 
     } 
    } 
} 

MyClass.cs

using System; 

namespace ExtensionMethodTest.Domain 
{ 
    public class MyClass 
    { 
     public string Name { get; set; } 
    } 
} 

MyClassExtensions.cs

using System; 

namespace ExtensionMethodTest.Domain 
{ 
    public static class MyClassExtensions 
    { 
     public static string UpperCaseName (this MyClass myClass) 
     { 
      return myClass.Name.ToUpper(); 
     } 
    } 
} 
+0

Byłem świadomy, że niealfaizowane użycie instrukcji zadziała, ale jestem po prostu ciekawy, * dlaczego * aliasowe użycie instrukcji * nie działa. :) –

+8

Instrukcja aliasowa używająca * nie * wprowadza aliasowaną przestrzeń nazw do zakresu rozpoznawania nazw. Wszystko, co robi, to zapewnienie aliasu dla określonej przestrzeni nazw dla wygody. Mimo że oba te stwierdzenia są "przy użyciu", działają zupełnie inaczej. Pomóc może "używać X"; jako przestrzeń nazw #include i "using Foo = X;" jako przestrzeń nazw #define. – JaredReisinger

+0

Ach, w takim przypadku zaryzykowałbym przypuszczenie, że to dlatego, że zdefiniowanie aliasu w rzeczywistości nie daje dostępu do tej przestrzeni nazw, ale podanie jej nazwy skrótu ... To jest ten sam powód, dla którego musiałbyś zrobić BillingContracts .MyClass() zamiast tylko MyClass(), gdy używasz aliasu. –

0

Uwielbiam również używać namespace aliasing, ale nie działa w przypadku metod rozszerzenia. Więc jedną rzeczą, którą zrobiłem, zmieniłem namespace klasy rozszerzenia na tę samą przestrzeń nazw, która ma moją main project (, mimo że moja klasa rozszerzeń znajduje się w podfolderze głównego projektu).

Załóżmy, że mam projekt myFirstProj, który z pewnością ma namespace myFirstProj dla klas głównych. Moja klasa rozszerzenia jest obecna w myFirstProj/Common/myExtensionClass i zawiera namespace myFirstProj.Common { //myExtensionClass }.

Więc teraz to, co zrobiłem w tym, że zmienił namespace z myExtensionClass z namespace myFirstProj.Common{ //myExtensionClass } do namespace myFirstProj{ //myExtensionClass }.

Teraz mogę używać mojego extension methods w całym moim zdarzeniu projektu myFirstProj bez określania instrukcji użycia dla mojej klasy rozszerzenia.

Wiem, że nie jest to standardowy sposób, ale nie znalazłem żadnego innego rozwiązania, ponieważ oczekuje tego, ponieważ dla mojego projektu istnieje wymóg, aby przejść z namespace aliasing dla przestrzeni nazw projektów.

Powiązane problemy