Search code examples
c#visual-studio-2008.net-3.5

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 MyClassExtensions
    {
        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!


Solution

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