我有這樣的方法,像這樣一個巨大的switch語句:靜態字典
public bool ExecuteCommand(string command, string args)
{
bool result = false;
switch (command)
{
case "command1": result = Method1(args); break;
case "command2": result = Method2(args); break;
// etc.
}
return result;
}
private bool Method1(string args) {...}
現在我想到了用Func<>
代表字典更換,這樣我可以消除開關語句:
private Dictionary<string, Func<string, bool>> _commands = new ...;
public MyClass()
{
_commands.Add("command1", Method1);
// etc:
}
public bool ExecuteCommand(string command, string args)
{
return _commands[command](args);
}
我看到這個問題,是一個新的字典被實例化,並填充每個新的MyClass實例。
是否有可能在靜態構造函數中以某種方式使該Dictionary(包含委託給實例方法)成爲靜態成員,該靜態成員將被初始化一次?
例如這樣的事情(不工作):
private static Dictionary<string, Func<string, bool>> _commands = new ...;
static MyClass()
{
// the following line will result in a compiler error:
// error CS0120: An object reference is required for the non-static field,
// method, or property 'MyClass.Method1(string, string)'
_commands.Add("command1", MyClass.Method1);
}
爲什麼它不起作用,錯誤是什麼?也許如果你懶惰初始化在一個靜態的getter,它的工作原理?這就是我通常的做法,對於單身人士等。 – ewernli
@ewernli:用編譯器錯誤更新了問題。 (注意:我需要調用實例方法,而不是靜態方法)。 – M4N
您收到的錯誤是引用嘗試在您的字典中添加'MyClass.Method1'作爲'Func'。不是Dictionary本身的靜態設置。 'Method1'方法關閉'MyClass'是一種靜態方法嗎?您收到的錯誤表明它不是,編譯器期望它。 –
Clayton