一个接一个地向委托添加参数,然后执行它

本文关键字:一个 然后 执行 参数 添加 | 更新日期: 2023-09-27 18:15:24

昨天我想创建一个ExceptionHandler类,例如我们可以传递:

  • 发生错误的方法
  • 给该方法的参数

ExceptionHandler将实现自定义业务逻辑,并使用相同的参数自动(或不)重新执行方法。

我找到的最接近的解决方案是使用像这样的delegate

private void button1_Click(object sender, EventArgs e)
{
    InvokeMyMethod(Test, "string", 1);
    InvokeMyMethod(TestN, "other string", 3, Color.Red);
}
public delegate void MyMethodDelegate(params object[] args);
public void InvokeMyMethod(MyMethodDelegate method, params object[] args)
{
    method.DynamicInvoke(args);
}
public void Test(params object[] args)
{
    if (args.Length < 2) return;
    MessageBox.Show(string.Format("{0}{1}", args[0], args[1]));
}
public void TestN(params object[] args)
{
    // or, whatewer
    if (args.Length < 3) return;
    MessageBox.Show(string.Format("{0}{1}{2}", args[0], args[1], args[2]));
}

然而,由于方法的签名,这个解决方案仍然不完美。我不希望我所有的方法都接收一个唯一的参数params object[] args,而且这通常是不可能直接的,例如与所有UI相关的事件(Winform, ASP。. NET、WPF等)。

所以我想知道是否有一种方法可以将一个接一个的参数传递给委托,然后只有在我们准备好时才执行该函数?

例如,下面是一个虚构的代码,其中不存在AddArgumentExecute方法

public void InvokeMyMethod(MyMethodDelegate method, params object[] args)
{
    foreach(var arg in args)
    {
        method.AddArgument(arg);
    }
    method.Execute();
}

通过这种方式,我们所有的函数都可以保留其原始签名并接收多个参数而不是一个数组。

一个接一个地向委托添加参数,然后执行它

您的原始代码一点也不差。你可以摆脱要求所有被调用的方法都有相同的签名,只要你让InvokeMyMethod只接受抽象委托类,并在调用函数时显式指定委托类型(它不会推断类型)。我们可以利用c#中有泛型委托类型这一事实,这样我们就不需要声明我们想要使用的每一组可能的方法签名。

如果你想调用有返回值的函数,你需要使用Func<>来代替Action<>

private void button1_Click(object sender, EventArgs e)
{
    InvokeMyMethod((Action<string,int>) Test, "string", 1);
    InvokeMyMethod((Action<string,int,Color>) TestN, "other string", 3, Color.Red);
}
public void InvokeMyMethod(Delegate method, params object[] args)
{
    method.DynamicInvoke(args);
}
public void Test(string s, int i)
{
    MessageBox.Show(string.Format("{0}{1}", s, i));
}
public void TestN(string s, int i, Color c)
{
    // or, whatewer
    MessageBox.Show(string.Format("{0}{1}{2}", s, i , c);
}
相关文章: