2010-07-26 3 views
14

Это может быть неосведомленный вопрос, но я не уверен, почему я не могу использовать методы псевдонимов пространства имен и методы расширения вместе.Почему методы расширения не работают с псевдонимом пространства имен?

Следующий пример работает просто отлично:

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(); 
     } 
    } 
} 

Однако, когда я псевдоним домена следующим образом в Program.cs:

using Domain = ExtensionMethodTest.Domain; 

Метод расширения больше не работает ..

Это может быть довольно неприятно, когда я имею дело с преобразованием различных объекты домена для контрактных объектов (допустим, у меня есть 4 сборки домена и 4 сборки контракта) для использования в веб-службе. Использование псевдонимов было бы очень удобно, как я мог бы псевдоним следующим образом и продолжать использовать различные методы расширения (например, ToContract и т.д.):

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

и т.д ...

Я с нетерпением жду ответа .. Я уверен, что это прямолинейно, но я, для жизни, не могу понять, почему это не работает.

Спасибо!

+2

Это хороший вопрос. Я не уверен в точном ответе, но, вероятно, это связано с тем, что метод расширения привязан к методу расширения * type *, а не к его * пространству имен *. Следовательно, сам тип должен быть виден внутри вашего класса, поэтому вам все равно придется включать полный оператор 'using'. –

ответ

10

Убедитесь, что еще добавить без алиасом используя оператор:

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

Я знал, что будет работать не сглаженный оператор using, но мне просто интересно, почему * сглаженный оператор using * не работает *. :) –

+8

Операция с использованием псевдонимов * не * приносит псевдониму пространства имен в область для разрешения имен. Все, что он делает, это обеспечить псевдоним для конкретного пространства имен для удобства. Несмотря на то, что оба эти утверждения являются «использующими» заявления, они действуют совершенно по-другому. Это может помочь подумать о «использовании X»; как пространство имен #include и «используя Foo = X;» как пространство имен #define. – JaredReisinger

+0

Ах, в этом случае я бы рискнул предположить, что это связано с тем, что определение псевдонима не дает вам доступ к этому пространству имен, но предоставляет ему кратчайшее имя ... Это по той же причине вам придется делать BillingContracts .MyClass() вместо MyClass(), когда вы используете псевдоним. –

0

Я также люблю использовать namespace aliasing но не работает в случае методов расширения. Итак, одна вещь, которую я сделал, я изменил класс расширения namespace в том же пространстве имен, что и у моего main project (, хотя мой класс расширения находится в подпапке основного проекта).

Предположим, у меня есть проект myFirstProj который наверняка имеет namespace myFirstProj для классов корней. Мой класс расширения присутствует в myFirstProj/Common/myExtensionClass с содержит namespace myFirstProj.Common { //myExtensionClass }.

Итак, теперь я сделал то, что я сделал namespace от myExtensionClass от namespace myFirstProj.Common{ //myExtensionClass } до namespace myFirstProj{ //myExtensionClass }.

Теперь я могу использовать мой extension methods во всем моем проекте myFirstProj событие без указания с помощью оператора для моего класса расширения.

Я знаю, что это не стандартный способ, но я не нашел другого способа обхода, потому что для моего проекта есть требование пойти с namespace aliasing для пространств имен проектов.

Смежные вопросы