Почему я не могу “видеть” этот перечислимый дополнительный метод?

Почему я не могу видеть этот перечислимый дополнительный метод? (Я думаю, что схожу с ума).

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);            
        }
    }
}
9
задан Ben 20 July 2010 в 07:07
поделиться

4 ответа

Вы пытаетесь вызвать метод расширения как статический метод для типа, а не как метод экземпляра для объекта этого типа. Такое использование методов расширения не поддерживается.

Если у вас есть экземпляр, будет найден метод расширения:

Website website = Website.Website1;
var websites = website.ToDictionary<int>();
15
ответ дан 4 December 2019 в 11:03
поделиться

Вам необходимо изменить подпись вашего метода расширения, чтобы использовать ваше перечисление , а не сам тип Enum . То есть измените Enum на Website в сигнатуре метода расширения:

public static IDictionary ToDictionary<TEnumValueType>(this Website enum, ...)
0
ответ дан 4 December 2019 в 11:03
поделиться

это Enum e относится к экземпляру перечисления, тогда как Веб-сайт фактически является типом класса перечисления.

2
ответ дан 4 December 2019 в 11:03
поделиться

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

К вашему сведению, помимо того, что сказал Марк, код преобразуется, как показано ниже, при компиляции.

//Your code
Website website = new Website();
var websites = website.ToDictionary<int>();


//After compilation.
Website website = new Website();
var websites = EnumExtensions.ToDictionary<int>(website);

Улучшенная версия метода Extension должна расширять только тип Website, а не Enum.

//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);            
    }
}
2
ответ дан 4 December 2019 в 11:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: