【问题标题】:Can a method be attached to a delegate with predefined parameters?可以将方法附加到具有预定义参数的委托吗?
【发布时间】:2011-12-30 13:52:22
【问题描述】:

有时我会遇到必须将方法附加到委托但签名不匹配的情况,例如尝试将 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");

【问题讨论】:

  • 我认为你应该重新考虑你想要做什么。您正在尝试调用没有所有必需参数的方法?考虑所有的影响,不正确的结果,错误等。而是使用方法重载或实现Command Pattern重新设计你的类
  • 这称为柯里化,通常在函数式编程和模块化编程中非常有用。 stackoverflow.com/questions/36314/what-is-currying

标签: c# parameters delegates


【解决方案1】:

是的,你可以用闭包做到这一点

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

【讨论】:

  • 太棒了。好一个。只是将其更改为已接受的答案。顺便问一下,你在 msdn 上从哪里得到它?
  • 这很笨拙,但实际上是正确的方法,除了使用匿名函数会不那么麻烦。
【解决方案2】:

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

更新(对此进行了更多研究,并得到了上面第一个链接的帮助):

您能否使用Invoke 方法,它接受任何委托?

【讨论】:

  • 抱歉,我问的不是可选参数。我试图通过在附加时预设一些参数来将具有不同签名的方法放入委托中
  • 啊,抱歉。我被你的问题的标题推迟了,并认为字符串参数可能是可选的。除了使用可选参数之外,我认为您无法实现您想要的,因为这正是代表的重点。
  • 感谢您的回答。我刚问了我的朋友,我想我可以用这样的匿名方法来实现它: x += (int i) => abc(i, "hi");还是谢谢!
  • testgo,很高兴您找到了解决方案。 +1,因为我没有想到这一点。最好现在回答您自己的问题并提供代码示例。这样,其他开发人员可以使用此答案。另外,它使 StackOverflow 变得更好。有关接受您自己的答案的更多信息,请参阅此页面:blog.stackoverflow.com/2009/01/accept-your-own-answers
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多