2011-09-16 75 views
1

我正在開發一個數學/統計軟件。我希望我的客戶可以寫下如下內容:如何'解析'輸入字符串和調用目標函數?

Function1(value) 

然後,根據函數的名稱,調用我的內部軟件函數。 這似乎是一個「解析器」的權利?

目前,我正在考慮用這樣的代碼來解決這個問題:

switch(my_parsed_function_string) { 
     case "function1": 
      result = function1(value); 
     case "function2": 
      result = function2(value); 
    ... 
    ... 
    } 

是否有一個更優雅的方式? 一個字符串包含'函數'名稱的方法可以在沒有額外開發人員工作的情況下執行嗎?

預先感謝您

回答

2

是的,有。它被稱爲IDictionary。更具體地說,在你的情況下,它將更像IDictionary<string, Func<double>>。因此,您的代碼變成

var functions = new Dictionary<string, Func<double>>(); 
var act = functions[my_parsed_function_string].Invoke(arg); 
-2

你可以在單個對象申報的所有功能,則反映其獲得方法的名字呢?

1

您可以使用Command Pattern。例如:

interface ICommand 
{ 
    void Execute();  
} 

class Function1Command : ICommand 
{ 
    public void Execute() 
    { 
     // ... 
    } 
} 

class Function2Command : ICommand 
{ 
    public void Execute() 
    { 
     // ... 
    } 
} 

// Bind commands 
IDictionary<string, ICommand> commands = new Dictionary<string, ICommand>(); 
commands["Function1"] = new Function1Command(); // function 1 
commands["Function2"] = new Function2Command(); // function 2 
// ... 

然後,你可以打電話給你的函數是這樣的:

ICommand command = commands[parsedFunctionName] as ICommand; 
if(command != null) 
{ 
    command.Execute(); 
}