如何将方法作为参数传递? 我一直在Javascript中这样做,需要使用匿名方法来传递params。我如何在c#中完成?
protected void MyMethod(){
RunMethod(ParamMethod("World"));
}
protected void RunMethod(ArgMethod){
MessageBox.Show(ArgMethod());
}
protected String ParamMethod(String sWho){
return "Hello " + sWho;
}
答案 0 :(得分:13)
Delegates提供此机制。在C#3.0中为您的示例执行此操作的快速方法是使用Func<TResult>
TResult
为string
和lambdas。
您的代码将成为:
protected void MyMethod(){
RunMethod(() => ParamMethod("World"));
}
protected void RunMethod(Func<string> method){
MessageBox.Show(method());
}
protected String ParamMethod(String sWho){
return "Hello " + sWho;
}
但是,如果您使用的是C#2.0,则可以改为使用匿名委托:
// Declare a delegate for the method we're passing.
delegate string MyDelegateType();
protected void MyMethod(){
RunMethod(delegate
{
return ParamMethod("World");
});
}
protected void RunMethod(MyDelegateType method){
MessageBox.Show(method());
}
protected String ParamMethod(String sWho){
return "Hello " + sWho;
}
答案 1 :(得分:9)
您的ParamMethod类型为Func&lt; String,String&gt;因为它需要一个字符串参数并返回一个字符串(请注意,有角度括号中的最后一项是返回类型)。
所以在这种情况下,你的代码会变成这样:
protected void MyMethod(){
RunMethod(ParamMethod, "World");
}
protected void RunMethod(Func<String,String> ArgMethod, String s){
MessageBox.Show(ArgMethod(s));
}
protected String ParamMethod(String sWho){
return "Hello " + sWho;
}
答案 2 :(得分:7)
看看C#代表
http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx
教程http://www.switchonthecode.com/tutorials/csharp-tutorial-the-built-in-generic-delegate-declarations
答案 3 :(得分:4)
protected String ParamMethod(String sWho)
{
return "Hello " + sWho;
}
protected void RunMethod(Func<string> ArgMethod)
{
MessageBox.Show(ArgMethod());
}
protected void MyMethod()
{
RunMethod( () => ParamMethod("World"));
}
() =>
很重要。它会从Func<string>
创建匿名Func<string, string>
,即ParamMethod。
答案 4 :(得分:0)
protected delegate String MyDelegate(String str);
protected void MyMethod()
{
MyDelegate del1 = new MyDelegate(ParamMethod);
RunMethod(del1, "World");
}
protected void RunMethod(MyDelegate mydelegate, String s)
{
MessageBox.Show(mydelegate(s) );
}
protected String ParamMethod(String sWho)
{
return "Hello " + sWho;
}