2013-02-03 249 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)。 –