可以将方法附加到具有预定义参数的委托上吗?

本文关键字:参数 预定义 方法 | 更新日期: 2023-09-27 18:19:09

有时我遇到这样的情况:我必须将一个方法附加到一个委托,但签名不匹配,比如试图将abc附加到某个委托,其中字符串参数为"hi"。

public class test
{
   //...
   public void abc(int i, string x)
   {
      //Do Something
   }
   //...
}
public class test2
{
   somedelegate x;
   //...
   public test2()
   {
      //Do Something
      test y = new test();
      x += y.abc(,"hi");
   }
   delegate void somedelegate(int i);
}

我可以通过创建另一个具有正确签名的委托来解决这个问题,然后附加它,但它似乎不必要地复杂。你能在c#中做这样的事情吗?谢谢。

编辑:我想最接近我想要实现的是:

x += (int i) => abc(i, "hi");

可以将方法附加到具有预定义参数的委托上吗?

是的,您可以使用闭包

[msdn上对主题的处理很好,但像其他任何东西一样很难找到]

The Big Picture

  • 写一个可以接受你需要的所有参数的方法
  • 在该方法中,返回一个匿名方法,带有它需要的委托目标签名
  • 这个方法的调用本身就是委托实例化中的参数

是的,这是一个有点矩阵。但是很酷。

delegate void somedelegate (int i);
protected somedelegate DelegateSignatureAdapter ( string b, bool yesOrNo, ...) {
    // the parameters are local to this method, so we'll go w/ that.
    // our target delegate requires a single int parameter and void return
    return  (int a) => {
                // your custom code here
                // all calling arguements are in scope - use them as needed
    };  // don't forget the semicolon!
}
// our delegate call
somedelegate myWarpedDelegate = new somedelegate (DelegateSignatureAdapter("someString", true));
myWarpedDelegate (2543);
myWarpedDelegate(15);

搜索" .net delegate optional parameters "返回一些可能有用的结果:

  • 代理可以有可选参数吗?
  • VB。有没有办法在委托中使用可选参数?(或计划允许?)
  • 可选参数和委托

更新(在上面的第一个链接的帮助下进一步研究):

你可以使用Invoke方法吗?它可以接受任何委托。