Почему я не могу" увидеть " этот метод расширения перечисления?
почему я не вижу этот метод расширения перечисления? (Кажется, я схожу с ума).
File1.cs
namespace Ns1
{
public enum Website : int
{
Website1 = 0,
Website2
}
}
File2.cs
using Ns1;
namespace Ns2
{
public class MyType : RequestHandler<Request, Response>
{
public override Response Handle(Request request, CRequest cRequest)
{
//does not compile, cannot "see" ToDictionary
var websites = Website.ToDictionary<int>();
return null;
}
}
//converts enum to dictionary of values
public static class EnumExtensions
{
public static IDictionary ToDictionary<TEnumValueType>(this Enum e)
{
if(typeof(TEnumValueType).FullName != Enum.GetUnderlyingType(e.GetType()).FullName) throw new ArgumentException("Invalid type specified.");
return Enum.GetValues(e.GetType())
.Cast<object>()
.ToDictionary(key => Enum.GetName(e.GetType(), key),
value => (TEnumValueType) value);
}
}
}
4 ответов
вы пытаетесь вызвать метод расширения как статический метод для типа, а не как метод экземпляра для объекта этого типа. Это использование методов расширения не поддерживается.
Если у вас есть экземпляр, то метод удлинение:
Website website = Website.Website1;
var websites = website.ToDictionary<int>();
this Enum e
относится к экземпляру перечисления, тогда как веб-сайт фактически является типом класса перечисления.
методы расширения являются просто syntactic sugar
и only work with instances and not with the type
. Поэтому вы должны вызвать метод расширения для экземпляра типа Website
и не на самом типе, как упоминалось Марком.
к вашему сведению, В дополнение к тому, что сказал Марк, код преобразуется, как показано ниже при компиляции.
//Your code
Website website = new Website();
var websites = website.ToDictionary<int>();
//After compilation.
Website website = new Website();
var websites = EnumExtensions.ToDictionary<int>(website);
An improved version
метода расширения было бы расширить веб-сайт типа только, а не перечисление.
//converts enum to dictionary of values
public static class EnumExtensions
{
public static IDictionary ToDictionary<TEnumValueType>(this Website e)
{
if(typeof(TEnumValueType).FullName != Enum.GetUnderlyingType(e.GetType()).FullName) throw new ArgumentException("Invalid type specified.");
return Enum.GetValues(e.GetType())
.Cast<object>()
.ToDictionary(key => Enum.GetName(e.GetType(), key),
value => (TEnumValueType) value);
}
}
вам нужно изменить подпись вашего метода расширения для использования код перечисление, а не перечислить введите сам. То есть перемены Enum
to Website
в вашей подписи метода расширения:
public static IDictionary ToDictionary<TEnumValueType>(this Website enum, ...)