开发者

Why do extension methods not work with namespace aliasing?

This may be an ignorant question, but I'm unsure why I can not use namespace aliasing and extension methods together.

The following example works just fine:

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 MyClas开发者_如何学编程sExtensions
    {
        public static string UpperCaseName (this MyClass myClass)
        {
            return myClass.Name.ToUpper();
        }
    }
}

However, when I alias domain as follows in Program.cs:

using Domain = ExtensionMethodTest.Domain;

The extension method no longer works..

This can be rather frustrating when I'm dealing with converting various domain objects to contract objects (let's say I have 4 domain assemblies and 4 contract assemblies) for use in a web service. Using aliasing would be very handy as I could alias as follows and continue to use the various extension methods (such as ToContract, etc.):

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

etc...

I look forward to the answer.. I'm sure it's straight forward, but I, for the life of me, can't figure out why it doesn't work.

Thanks!


Make sure to still add a non-aliased using statement:

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


I also love to use namespace aliasing but its not working in case of Extension methods. So one thing that i did is, I changed the namespace of extension class to same namespace that my main project has (although my extension class resides in sub folder of main project).

Suppose I have a project myFirstProj which surely has namespace myFirstProj for root classes. My extension class is present in myFirstProj/Common/myExtensionClass with contains namespace myFirstProj.Common { //myExtensionClass }.

So now what I did is, I changed the namespace of myExtensionClass from namespace myFirstProj.Common{ //myExtensionClass } to namespace myFirstProj{ //myExtensionClass } .

Now i can use my extension methods in my whole project myFirstProj event without specifying using statement for my extension class.

I know this isn't a standard way to that but I haven't found any other workaround for it expect this one because for my Project there is a requirement to go with namespace aliasing for project namespaces.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜