可以使用预定义参数将方法附加到委托吗?

时间:2011-12-30 13:52:22

标签: c# parameters delegates

有时我会遇到需要将方法附加到委托但但签名不匹配的情况,例如尝试将abc附加到somedelegate,字符串参数为" 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");

2 个答案:

答案 0 :(得分:2)

直接搜索“.net委托可选参数”会返回一些可能有用的结果:

更新(通过上面的第一个链接进行更多研究,并提供帮助):

您是否可以使用接受任何委托的Invoke方法?

答案 1 :(得分:2)

是的,您可以使用闭包执行此操作

[在msdn上对这个主题进行了很好的处理,但就像其他任何东西一样很难找到]

大图

  • 编写一个可以获取所需参数的方法
  • 在该方法中,您返回一个匿名方法及其所需的委托目标签名
  • 此方法的调用本身是委托实例化中的参数

是的,这有点像Matrix-y。但是很酷。

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);