C#,使用反射来获取switch中的每个案例名称

时间:2014-11-05 00:09:24

标签: c# .net reflection switch-statement

这是一个字符串文字开关语句的设计示例:

static string GetStuff(string key)
{
    switch (key)
    {
        case "thing1": return "oh no";
        case "thing2": return "oh yes";
        case "cat": return "in a hat";
        case "wocket": return "in my pocket";
        case "redFish": return "blue fish";
        case "oneFish": return "two fish";
        default: throw new NotImplementedException("The key '" + key + "'  does not exist, go ask your Dad");
    }
}

你明白了。

我喜欢做的是通过反射打印每个案例的每个字符串。

我没有做足够的反思,知道如何直观地做到这一点。老实说,我不确定反思是否可以做到这一点。

可以吗?如果是这样,怎么样?

2 个答案:

答案 0 :(得分:5)

不,您无法使用Reflection API读取IL(这是您正在寻找的)。

你最接近的是MethodInfo.GetMethodBodyMethodBody class),它将为你提供带IL的字节数组。要获得方法的实现细节,您需要读取IL的库,如cecil

switch的{​​{1}}是根据选项数量使用stringif实施的 - 请参阅Are .Net switch statements hashed or indexed?。因此,如果阅读IL会考虑到这一点。*

请注意,您应该使用其他一些机制来表示您的数据,而不是尝试从已编译的代码中读取它。即使用字典来表示MikeH's answer建议的选择。

Mad Sorcerer找到的Dictionary实施的

* 信息。

答案 1 :(得分:2)

如何使用Dictionary

  Dictionary<string, string> dict = new Dictionary<string, string>();
  dict.Add("thing1", "oh no");
  dict.Add("thing2", "oh yes");
  //and on and on

  string GetStuff(string key)
  {
    if (dict.ContainsKey(key))
      return dict[key];
    else
      return null; //or throw exception
  }

对于您的菜单:

 void addToMenu()
 {
   foreach (string key in dict.Keys)
   {
     //add "key" to menu
   }

 }