基于查找表中的数据运行函数

时间:2009-12-23 22:31:53

标签: c# .net c#-2.0

我想基于查找表中的值调用方法。这些值将在数据库中查找,并将进行迭代。我想避免的是:

foreach (Row r in rows)
{
   if (r["command"] == "Command1")
         MyClass.Command1();
   else if (r["command"] == "Comman2")
         MyClass.Command2();
   else if (r["command"] == "Comman3")
         MyClass.Command3();
}

这是我必须支持的遗留代码,但我知道肯定有更好的方法可以做到这一点。目前代码如上所示,但我正在寻找更优雅的解决方案。

编辑:

根据以下建议,我尝试做类似的事情:

    static void Main(string[] args)
    {

        Dictionary<string, Action<MyClass>> myActions = new Dictionary<string,Action<MyClass>>();
        myActions.Add("Command1",MyClass.DoCommand1("message1"));
        myActions.Add("Command2",MyClass.DoCommand1("message2"));

        myActions["Command1"]();

    }

我的类文件看起来像这样:

public class MyClass
{
    public void DoCommand1(string message)
    {
        Console.WriteLine(message);
    }

    public void DoCommand2(string message)
    {
        Console.WriteLine(message);
    }
}

但是,我收到语法错误,说明非静态字段,方法或属性MyClass.DoCommand1(字符串)需要对象引用。有什么想法吗?

请注意我使用的是.NET 2.0框架。

4 个答案:

答案 0 :(得分:2)

您可以使用反射:

string command = (string)r["command"];
typeof(MyClass)
    .GetMethod(command, BindingFlags.Static | BindingFlags.Public)
    .Invoke (null, null);

或者你也可以使用代表:

var actionMap = new Dictionary<string, Action<string>> {
    {"SomeAction", MyClass.SomeAction},
    {"SomeAction2", MyClass.SomeAction2},
    {"SomeAction3", MyClass.SomeAction3},
};
actionMap[r["command"]]("SomeString");

通过代理,您可以获得良好的语法并避免反射的性能损失。

<强>更新 我注意到你使用的是.NET 2.0,你需要这样做:

class Program
{
    delegate void PoorManAction (string param);
    static void Main(string[] args)
    {

        Dictionary<string, PoorManAction> actionMap = new Dictionary<string, PoorManAction>();
        actionMap.Add("SomeMethod1", MyClass.SomeMethod1);
        actionMap.Add("SomeMethod2", MyClass.SomeMethod2);
        actionMap.Add("SomeMethod3", MyClass.SomeMethod3);
        actionMap.Add("SomeMethod4", MyClass.SomeMethod4);
        actionMap[r["command"]]("SomeString");

    }
}

更新2::现在,该示例使用带有字符串参数的方法,如更新后的问题所示

答案 1 :(得分:1)

您可以使用反射来调用方法。

typeof (MyClass)
    .GetMethod((string)r["command"], BindingFlags.Static | BindingFlags.Public)
    .Invoke(null, null);

答案 2 :(得分:1)

您应该使用匿名委托从一个方法中生成一个委托,其中一些(或所有)参数绑定到特定值:

static void Main(string[] args)
{
    Dictionary<string, Action<MyClass>> myActions =
        new Dictionary<string,Action<MyClass>>();

    myActions.Add("Command1",
       delegate { MyClass.DoCommand1("message1"); });
    myActions.Add("Command2",
       delegate { MyClass.DoCommand1("message2"); });

    myActions["Command1"]();

}

答案 3 :(得分:0)

您可以使用反射来动态调用该方法。由于使用反射的开销,它可能不如switch语句有效。