为什么扩展方法不适用于命名空间别名?

问题描述:

这可能是一个无知的问题,但我不确定为什么我不能一起使用名称空间别名和扩展方法。为什么扩展方法不适用于命名空间别名?

下面的例子非常有效:

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个契约程序集)用于Web服务。使用别名将是非常方便的,因为我可以别名如下,并继续使用各种推广方法(如ToContract等):

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

等等

我期待着答案..我相信这很简单,但是,对于我来说,我无法弄清楚为什么它不起作用。

谢谢!

+2

这是一个很好的问题。我不确定确切的答案,但它可能与扩展方法绑定到扩展方法的* type *而不是它的*名称空间*有关。因此,类型本身必须在您的类中可见,所以您仍然必须包含完整的'using'语句。 – 2010-07-26 17:54:22

确保仍然添加的非别名 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

我意识到一个非别名使用语句可以工作,但我只是好奇*为什么*别名使用语句*不工作。 :) – 2010-07-26 18:00:29

+8

别名using语句不会*将别名名称空间带入名称解析的范围。它所做的只是为了方便而为特定的名称空间提供一个别名。尽管这些陈述都是“使用”陈述,但它们的表现却完全不同。这可能有助于思考“使用X;”作为命名空间#include和“使用Foo = X;”作为命名空间#define。 – JaredReisinger 2010-07-26 18:09:13

+0

啊,在这种情况下,我想冒险猜测这是因为定义一个别名实际上并没有给你访问该名称空间,但提供了一个快捷名称... 这是你必须做BillingContracts .MyClass()而不是仅使用MyClass()时使用别名。 – 2010-07-26 18:09:14

我也喜欢使用namespace aliasing,但它不适用于扩展方法。这么一两件事,我就是这样做,我改变了扩展类的namespace到我main project具有相同的命名空间(虽然我的扩展类存在于主体工程的子文件夹)。

假设我有一个项目myFirstProj这肯定有namespace myFirstProj根类。我的扩展类存在于myFirstProj/Common/myExtensionClass与含有namespace myFirstProj.Common { //myExtensionClass }

所以现在我所做的是,我将namespacemyExtensionClassnamespace myFirstProj.Common{ //myExtensionClass }更改为namespace myFirstProj{ //myExtensionClass }

现在我可以在我的整个项目myFirstProj事件中使用我的extension methods事件,而无需为我的扩展类指定使用语句。

我知道这不是一个标准的方法,但我还没有找到任何其他的解决方法,因为它期望这一个,因为我的项目有一个需要与namespace aliasing项目命名空间。