我有一个我希望调用的方法列表,每个方法都有一个按钮,以及处理按钮的通用方法。
使用commandArgument如何运行所选方法。
E.g。单击运行method1按钮。在按钮的处理程序中,单击调用commandArgument
中指定的方法答案 0 :(得分:3)
为什么不实际使用类似命令模式的东西?
public interface ICommand
{
bool CanExecute(string command);
void Execute();
}
public class MethodACommand : ICommand
{
private MyForm form;
public MethodACommand(MyForm form) {... }
public bool CanExecute(string command) { return command.Equals("MethodA"); }
public void Execute() { form.MethodA(); }
}
public class CommandHandler
{
public CommandHandler(IEnumerable<ICommand> commandString) {...}
public Execute(string command)
{
foreach(var command in Commands)
{
if (command.CanExecute(commandString))
{
command.Execute();
break;
}
}
}
}
protected void Button_Click(object sender, EventArgs e)
{
string arg = ((Button)sender).CommandArgument; // = MethodA
commandHandler.Execute(arg);
}
答案 1 :(得分:1)
如果您知道要调用的所有方法且数字不是很大,我只需使用switch语句来调用它们。否则你必须使用反射,参见例如http://www.codeproject.com/KB/cs/CallMethodNameInString.aspx举了一些例子。
答案 2 :(得分:1)
那么CommandArgument中的字符串是否匹配方法的名称?如果你必须这样做,那么你可以使用反射。我假设你基本上每个按钮都有一个按钮点击事件,或者你不会问这个:
private void MethodA() { }
protected void Button_Click(object sender, EventArgs e)
{
string arg = ((Button)sender).CommandArgument; // = MethodA
MethodInfo method = this.GetType().GetMethod(arg);
method.Invoke(this, null);
}
虽然这看起来像一个巨大的代码味道。你为什么要这样做呢?为什么你不能只给每个按钮一个单独的事件处理程序并直接调用每个方法?
或者,为什么不在参数上使用switch语句:
protected void Button_Click(object sender, EventArgs e)
{
string arg = ((Button)sender).CommandArgument; // = MethodA
switch (arg)
{
case "MethodA":
MethodA(); break;
case "MethodB":
MethodB(); break;
}
}
答案 3 :(得分:1)
我喜欢Ian的答案,但如果你想要一些不太复杂的东西,你可以设置代表字典:
private IDictionary<string, Action> actions = new Dictionary<string, Action> {
{ "MethodA", MethodA },
{ "MethodB", MethodB }
};
然后
protected void Button_Command( object sender, CommandEventArgs e )
{
if( actions.ContainsKey( e.CommandArgument ) )
actions[e.CommandArgument]();
else
throw new ArgumentException( "Cannot find action for key: "+ e.CommandArgument );
}
当然,如果你知道它们的类型,可以修改为接受参数。假设MethodA和MethodB没有参数并返回void。