2016-09-22 94 views
0

我正在爲基於文本的遊戲構建解析器,嘗試更像它。所以我想將所有可能的動詞和名詞存儲到他們自己的字典中。但是我正在嘗試從字典中的字符串鍵時的錯誤...正在檢索字典<string,Action>

在我的字典類,我創建了動詞詞典,就像這樣:

public Dictionary<string, Action> Verbs = new Dictionary<string, Action>(); 

我再繼續添加一些價值它:

public void PopulateVerbs() 
    { 
     Verbs.Add("MOVE", Action.MoveAction);   
    } 

在我VerbAction課,我有一個基於輸入該做的東西的方法:

Action Move = dictionary.Verbs["MOVE"]; 

    public void MoveAction() 
    { 
     Console.WriteLine("You moved..."); 
    } 

最後,在我的CommandHandler類,我處理輸入:

if (InputToken[0] == dictionary.Verbs["MOVE"]) 
      Action.MoveAction(); 

而且這是我得到的錯誤,它說,[「MOVE」]我想要檢索的字符串其實一個動作,所以我有點困惑。我在這裏錯過了什麼?

+0

所以基本上你所擁有的(結果)是「行動」 。意思是動詞[「string」] =動作the_action_you_defined'。當你定義'Dictionory someDictionary =新詞典''someDictionary [TKey]'返回類型'TValue' – Jaya

+0

現在是有道理,謝謝你清理! – Maxwell

+0

這個代碼中的「Action」是一個自定義的'enum'還是內置的'delegate'尚不清楚。第二個代碼片段指示前者。最終的代碼片段指示後者。 –

回答

3

動詞[「MOVE」]將獲得存儲與關鍵「MOVE」的,所以它會在這種情況下返回一個動作。我認爲InputToken是一個字符串列表,因爲你有一個完整的字典代表你的行動我可能會嘗試這樣的事情,所以你不需要一堆如果檢查字符串/動作值:

採取

if (InputToken[0] == dictionary.Verbs["MOVE"]) 
     Action.MoveAction(); 

,並使用字典,你的優勢:

Action theAction = dictionary.Verbs[InputToken[0]]; 
theAction(); 

您可以在此進一步凝聚太:

dictionary.Verbs[InputToken[0]](); 

此外,字典是一個非常強大的類,所以你可以使用它的功能來開始添加錯誤處理檢查(如果Verbs.ContainsKey等)

+0

健壯的你說?非常感謝! – Maxwell

+0

是的,你必須記住,你可能需要一個不存在的鍵的值。該字典可以讓你事先檢查 –

相關問題