2010-07-26 14 views
14

Esto puede ser una pregunta ignorante, pero no estoy seguro de por qué no puedo usar alias de espacio de nombres y métodos de extensión juntos.¿Por qué los métodos de extensión no funcionan con alias de espacio de nombres?

El siguiente ejemplo funciona bien:

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

Sin embargo, cuando alias de dominio de la siguiente manera en Program.cs:

using Domain = ExtensionMethodTest.Domain; 

El método de extensión ya no funciona ..

Esto puede ser bastante frustrante cuando estoy tratando con la conversión de varios objetos de dominio para contraer objetos (supongamos que tengo 4 conjuntos de dominios y 4 conjuntos de contratos) para usar en un servicio web. El uso de alias sería muy práctico, ya que pude alias de la siguiente manera y seguir utilizando los diferentes métodos de extensión (como ToContract, etc.):

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

etc ...

espero que la respuesta Estoy seguro de que es sencillo, pero yo, por mi vida, no puedo entender por qué no funciona.

Gracias!

+2

Es una buena pregunta. No estoy seguro de la respuesta exacta, pero probablemente tiene que ver con el hecho de que el método de extensión está vinculado al * tipo * del método de extensión, no a su * espacio de nombres *. Por lo tanto, el tipo en sí mismo debe ser visible dentro de su clase, por lo que aún tendría que incluir una declaración 'using' completa. –

Respuesta

10

Asegúrese de que todavía añadir un no alias using:

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

Estaba al tanto de que una instrucción de uso sin alias funcionaría, pero tengo curiosidad por * por qué * una declaración de uso con alias * no * funciona. :) –

+8

Una declaración de uso con alias no * pone * el espacio de nombres con alias en el alcance para la resolución del nombre. Todo lo que hace es proporcionar un alias para el espacio de nombre específico para mayor comodidad. Aunque ambas declaraciones son declaraciones "con uso", actúan de manera bastante diferente. Podría ayudar pensar en "usar X"; como un espacio de nombre #include, y "usando Foo = X;" como un espacio de nombres #define. – JaredReisinger

+0

Ah, en ese caso, me atrevería a adivinar que es porque definir un alias no le está dando acceso a ese espacio de nombres, sino que le proporciona un nombre de atajo ... Es la misma razón por la que tendría que hacer BillingContracts .MyClass() en lugar de solo MyClass() cuando usa un alias. –

0

También me gusta usar namespace aliasing pero no funciona en caso de métodos de extensión. Así que una cosa que hice fue cambiar el namespace de la clase de extensión al mismo espacio de nombres que mi main project tiene (aunque mi clase de extensión reside en la subcarpeta del proyecto principal).

Supongamos que tengo un proyecto myFirstProj que seguramente tiene namespace myFirstProj para las clases de raíz. Mi clase de extensión está presente en myFirstProj/Common/myExtensionClass con contiene namespace myFirstProj.Common { //myExtensionClass }.

Así que ahora lo que hice fue cambiar el namespace de myExtensionClass de namespace myFirstProj.Common{ //myExtensionClass } a namespace myFirstProj{ //myExtensionClass }.

Ahora puedo usar mi extension methods en todo mi proyecto myFirstProj evento sin especificar el uso de la declaración para mi clase de extensión.

Sé que esto no es una forma estándar de eso, pero no he encontrado ninguna otra solución porque espera esto porque para mi proyecto hay un requisito para ir con namespace aliasing para espacios de nombres de proyectos.

Cuestiones relacionadas