Почему методы расширения не работают с псевдонимом пространства имен?

Это может быть неосведомленный вопрос, но я не уверен, почему я не могу использовать методы псевдонимов пространства имен и расширения вместе.

Следующий пример работает просто отлично:

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 сборки контракта) для использования в веб-службе. Использование aliasing было бы очень удобно, поскольку я мог бы использовать псевдоним следующим образом и продолжать использовать различные методы расширения (такие как ToContract и т.д.):

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

и т.д...

Я с нетерпением жду ответа. Я уверен, что это прямо, но я, для своей жизни, не могу понять, почему это не работает.

Спасибо!

Ответы

Ответ 1

Обязательно добавьте оператор без сглаживания:

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

Ответ 2

Я также люблю использовать namespace aliasing, но не работает в случае методов расширения. Итак, одна вещь, которую я сделал, я изменил namespace класса расширения в то же пространство имен, что и мой main project (хотя мой класс расширения находится в подпапке основного проекта).

Предположим, что у меня есть проект myFirstProj, который, несомненно, имеет namespace myFirstProj для корневых классов. Мой класс расширения присутствует в myFirstProj/Common/myExtensionClass с содержит namespace myFirstProj.Common { //myExtensionClass }.

Итак, теперь я сделал, что я изменил namespace myExtensionClass с namespace myFirstProj.Common{ //myExtensionClass } на namespace myFirstProj{ //myExtensionClass }.

Теперь я могу использовать мой extension methods в моем проекте myFirstProj без указания инструкции для моего класса расширения.

Я знаю, что это не стандартный способ, но я не нашел другого способа обхода, потому что для моего проекта есть требование идти с namespace aliasing для пространств имён проектов.