这是一个字符串文字开关语句的设计示例:
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");
}
}
你明白了。
我喜欢做的是通过反射打印每个案例的每个字符串。
我没有做足够的反思,知道如何直观地做到这一点。老实说,我不确定反思是否可以做到这一点。
可以吗?如果是这样,怎么样?
答案 0 :(得分:5)
不,您无法使用Reflection API读取IL(这是您正在寻找的)。
你最接近的是MethodInfo.GetMethodBody
(MethodBody class),它将为你提供带IL的字节数组。要获得方法的实现细节,您需要读取IL的库,如cecil。
switch
的{{1}}是根据选项数量使用string
或if
实施的 - 请参阅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
}
}