2011-12-30 86 views
3

有时我会遇到一些情况,我必须将一个方法附加到委托上,但签名不匹配,比如尝试将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”);这样做。所以现在没问题,谢谢你们。

+0

我想你应该重新考虑你想要做的事情。你正试图调用一个没有所有必需参数的方法?考虑所有的含义,错误的结果,错误等。而是重新设计你的类使用方法重载或实现[命令模式](http://en.wikipedia.org/wiki/Command_pattern) – shenku 2012-02-24 03:01:48

+0

这被称为咖喱,是通常在功能性编程和模块化编程中非常有用。 http://stackoverflow.com/questions/36314/what-is-currying – irisjay 2016-10-28 18:17:35

回答

2

是的,你可以关闭

做到这一点[有MSDN上的主题一个很好的治疗方法,但像有什么事,很难找到]

大图片

  • 写一个方法,可以把你需要的所有参数
  • 在那个方法里面你返回一个anony与委托目标签名的谅解备忘录方法它需要
  • 这种方法的调用本身在委托实例化

是的,这是一个有点矩阵-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); 
+0

真棒。好的。只是将其更改为接受的答案。顺便说一句,你在MSDN上获取它的位置? – irisjay 2011-12-31 06:56:42

+0

这是笨拙的,但实际上正确的方式,除了使用匿名函数将不那么繁琐。 – irisjay 2016-10-28 10:13:25

2

只是谷歌搜索” .NET代表的可选参数的回报率一定的成果,可能是有用的:

更新(研究这个更多一些,并得到上述第一条链接的帮助):

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

+0

对不起,但我不问可选参数。即时通讯尝试通过预先设置一些参数,将具有不同签名的方法放入代表时,附上 – irisjay 2011-12-30 14:06:54

+0

啊,道歉。我被你的问题的标题推迟了,并认为字符串参数可以是可选的。除了使用可选参数之外,我不认为你能达到你想要的,因为这正是代表的观点。 – Peter 2011-12-30 14:14:58

+1

感谢您的答案。我刚才问我的朋友,我想我可以用这样的匿名方法实现它: x + =(int i)=> abc(i,“hi”);无论如何感谢 ! – irisjay 2011-12-30 14:20:09

相关问题