Почему методы расширения не работают с псевдонимом пространства имен?
Это может быть неосведомленный вопрос, но я не уверен, почему я не могу использовать методы псевдонимов пространства имен и расширения вместе.
Следующий пример работает просто отлично:
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
для пространств имён проектов.