为什么扩展方法不适用于命名空间别名?
这可能是一个无知的问题,但我不确定为什么我不能一起使用命名空间别名和扩展方法。
以下示例运行正常:
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;
等等…
我期待着答案……我确信这是直截了当的,但是,对于我的生活,我无法弄清楚为什么它不起作用。
谢谢!
确保仍然添加一个无别名的 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(); } } }
我也喜欢使用namespace aliasing
但在扩展方法的情况下它不起作用。 所以我做的一件事是,我将扩展类的namespace
更改为我的main project
具有的相同名称空间( 尽管我的扩展类位于主项目的子文件夹中 )。
假设我有一个项目myFirstProj
肯定有根类的namespace myFirstProj
。 我的扩展类存在于myFirstProj/Common/myExtensionClass
,包含namespace myFirstProj.Common { //myExtensionClass }
。
所以我现在所做的是,我将myExtensionClass
的namespace
从namespace myFirstProj.Common{ //myExtensionClass }
更改为namespace myFirstProj{ //myExtensionClass }
。
现在我可以在我的整个项目myFirstProj
事件中使用我的extension methods
,而无需为我的扩展类指定using语句。
我知道这不是一种标准的方法,但是我没有找到任何其他的解决方法,因为对于我的项目,需要为项目命名空间使用namespace aliasing
。