Böyle büyük bir switch ifadesi ile bu yöntemi vardır: Statik Sözlük
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) {...}
Şimdi ben switch deyimi ortadan kaldırabilir böylece
Func<>
delege sözlükle bu değiştirerek düşündü:
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);
}
bununla bakın sorun, yeni bir sözlük örneği ve Sınıfım her yeni örneği doldurulur olmasıdır.
Sözlük'ü (örnek yöntemlere temsilci içeren) statik yapıcıda yalnızca bir kez başlatılacak statik bir üye yapmak bir şekilde mümkün müdür?
E.g. böyle bir şey (çalışmıyor):
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);
}
Neden çalışmıyor, hata nedir? Belki de statik bir alıcıda tembelleşirseniz, işe yarıyor mu? Ben genellikle böyle, singleton, vb için gidiyorum. – ewernli
@ewernli: soruyu derleyici hatasıyla güncelledi. (Not: Statik yöntemler yerine örnek yöntemlerini çağırmam gerekir). – M4N
Aldığınız hata, sözlüğünüzde 'MyClass.Method1' ifadesini' Func 'olarak eklemeyi denemektir. Sözlüğün kendisinin statik kurulumu değil. 'Method1' yöntemi' MyClass' kapalı statik bir yöntem midir? Aldığınız hata, olmadığını ve derleyicinin olmasını beklediğini gösterir. –
Clayton