2014-11-05 34 views
1

這裏是一個字符串switch語句的一個人爲的例子:C#,使用反射來在開關獲取每個病例名

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"); 
    } 
} 

你的想法。

我想做的是通過反射爲每個案例打印每個字符串。

我還沒有做足夠的反思,知道如何直觀地做到這一點。我真的不確定反思能否做到這一點。

可以這樣做嗎?如果是這樣,怎麼樣?

+1

反射是用於查看對象信息,即類,屬性,方法等。這些內部的代碼不能被反映。看看訪問者模式:http://en.wikipedia.org/wiki/Visitor_pattern – TyCobb 2014-11-05 00:15:34

+1

不幸的是,這裏的鏈接問答沒有澄清。目前還不清楚「編譯時初始化」是什麼意思,並且該鏈接中給出的答案具體指出了我之前提到的內容,即如果您有足夠的「case」標籤(IIRC,閾值爲七個或更多)代碼只是變成了字典。你想在這裏實現什麼,你不能用一本真正的字典? – 2014-11-05 00:23:45

+0

我不知道這個功能。我當時只是在尋找一個const Dictionary。問題雖然是天氣,我可以通過反射或不通過這些。這就是我真正需要知道的。我知道字典是要走的路,因爲你的建議,我會切換到這個機制。 – OneHoopyFrood 2014-11-05 00:25:32

回答

5

不,你不能讀取IL(這是你在找什麼)與反射的API。

最接近你可以來的是MethodInfo.GetMethodBodyMethodBody class)這將給你帶有IL的字節數組。要獲得方法的實現細節,您需要讀取IL的庫,如cecil。看到Are .Net switch statements hashed or indexed? -

switchstring使用ifDictionary基礎上,選擇數量來實現。所以如果閱讀IL考慮到這一點。*

請注意,您應該使用一些其他機制來表示您的數據,而不是從編譯代碼中讀取它。即使用字典來表示MikeH's answer建議的選擇。

* switch信息由Mad Sorcerer發現。

+0

這就是我想知道的。我同意其他方法是存儲信息的更好方法。但那不是我所問的。 – OneHoopyFrood 2014-11-05 00:21:19

+1

@colepanike不是最簡單的任務。請參閱[this](http://stackoverflow.com/questions/3366376/are-net-switch-statements-hashed-or-indexed)來查看IL'switch'實現的一些細節。我會用'Dictionary'代替解析方法的主體。 – 2014-11-05 01:13:50

+0

@MadSorcerer - 感謝鏈接 - 內置到後。 – 2014-11-05 02:55:46

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 
    } 

} 
+0

你甚至可以使用更短的initalizer語法:'new Dictionary {{「thing1」,「oh no」},{「thing2」,「oh yes」}}'TryGetValue ' – 2014-11-05 00:15:30

+0

我不使用字典的原因是編譯時限制。我選擇了這個固然相當醜陋的語法,因爲'Dictionary'不能在編譯時進行。 – OneHoopyFrood 2014-11-05 00:15:55

+0

@LucasTrzesniewski非常真實。儘管我想澄清一下。 – MikeH 2014-11-05 00:16:13