Почему методы расширения не работают с псевдонимами пространства имен? - PullRequest
16 голосов
/ 26 июля 2010

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

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

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

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

и т.д ...

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

Спасибо!

Ответы [ 2 ]

11 голосов
/ 26 июля 2010

Обязательно добавьте без псевдонима , используя оператор:

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 голосов
/ 25 мая 2017

Я также люблю использовать 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 событие без указания оператора using для моего класса расширения.

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

...