tôi có phương pháp này với một câu lệnh switch khổng lồ như thế này:từ điển tĩnh chứa các đại biểu với các phương pháp dụ
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) {...}
Bây giờ tôi nghĩ đến việc thay thế này với một cuốn từ điển của Func<>
đại biểu để tôi có thể loại bỏ các câu lệnh switch:
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);
}
Vấn đề tôi thấy với điều này, là một từ điển mới được khởi tạo và phổ biến với mỗi phiên bản mới của MyClass.
Có thể bằng cách nào đó làm cho từ điển đó (có chứa các đại biểu cho các phương thức mẫu) một thành viên tĩnh, chỉ được khởi tạo một lần, trong hàm dựng tĩnh không?
Ví dụ: một cái gì đó như thế này (không hoạt động):
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);
}
Tại sao nó không hoạt động, lỗi là gì? Có lẽ nếu bạn lười biếng-khởi tạo trong một getter tĩnh, nó hoạt động? Đó là cách tôi thường xuyên sử dụng, đối với singleton, v.v. – ewernli
@ewernli: cập nhật câu hỏi với lỗi trình biên dịch. (lưu ý: Tôi cần gọi phương thức instance, không phải phương thức tĩnh). – M4N
Lỗi mà bạn đang nhận đang tham chiếu đến việc thêm 'MyClass.Method1' làm chuỗi' Func <, bool> 'trong từ điển của bạn. Không phải thiết lập tĩnh của chính Từ điển. Phương thức 'Method1' có tắt' MyClass' là phương thức tĩnh không? Lỗi bạn nhận được cho biết nó không phải và trình biên dịch mong đợi nó được. – Clayton