2013-02-03 53 views
0

我努力使此方法泛型方法:類型枚舉

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_")) 

謝謝。

回答

3
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"); 
+2

也許你可以添加你如何調用該方法的一個小例子?也就是說,你應該添加一個[約束來確保T是一個枚舉](http://stackoverflow.com/a/1409873/588868)。 –

+0

你需要返回創建的列表(我知道提問者也忘記了)。我不知道他們爲什麼不製作通用版本的'Enum.GetValues'。而不是'.Cast ()'你也可以說'((T [])Enum.GetValues(typeof(T)))'(或者在這種情況下,當你創建KeyValuePair <,>時只是unbox)。 –