Я пытаюсь сделать из этого метода общий метод:

public static SelectList LanguagesToSelectList()
{
   return new SelectList(
        Enum.GetValues(typeof(Languages))
        .Cast<Languages>()
        .Select(g => new KeyValuePair<Languages, string>(
            g,
            Resources.Views_GamesAndApplications.ResourceManager.GetString("Language_" + g.ToString()
            )
        )), 
        "Key", 
        "Value"
        );
}  

Вот что у меня получилось:

public static SelectList ToSelectList(Enum enumType, ResourceManager resourceManager, string resourcePrefix)
{
    return new SelectList(
        Enum.GetValues(typeof(enumType))
        .Cast<enumType>()
        .Select(g => new KeyValuePair<enumType, string>(
            g,
            resourceManager.GetString(resourcePrefix + g.ToString())
            )), 
        "Key", 
        "Value");
} 

Однако enumType не должен иметь тип Enum (и не должен быть типа Type), и я не могу понять, какой тип ДОЛЖЕН быть, или должен ли я перефразировать весь метод ..

Пример использования (соответствует данному ответу):

@Html.DropDownListFor(
    m => m.Language,  
    SelectListHelper.ToSelectList<Languages>   
      (Resources.Views_GamesAndApplications.ResourceManager,"Language_"))

Спасибо.

0
Oren A 3 Фев 2013 в 11:49

1 ответ

Лучший ответ
public static SelectList ToSelectList<T>(ResourceManager resourceManager, string resourcePrefix)
    where T : struct 
{
    return new SelectList(Enum.GetValues(typeof(T)).Cast<T>()
                .Select(g => new KeyValuePair<T, string>(g, resourceManager.GetString(resourcePrefix + g.ToString()))), "Key", "Value");
}  

//Example:
var list = ToSelectList<Languages>(someResourceManager, "somePrefix");
3
SeeSharp 3 Фев 2013 в 12:14
2
Может быть, вы можете добавить небольшой пример того, как вы можете вызвать этот метод? При этом вам следует добавить ограничение, чтобы гарантировать, что T является перечислением.
 – 
Steve B
3 Фев 2013 в 12:01
Вам нужно вернуть созданный список (я знаю, что спрашивающий тоже забыл об этом). Я не знаю, почему они не делают общую версию Enum.GetValues. Вместо .Cast<T>() вы также можете сказать ((T[])Enum.GetValues(typeof(T))) (или в этом случае просто распаковать при создании KeyValuePair<,>).
 – 
Jeppe Stig Nielsen
3 Фев 2013 в 12:13