将类/实例函数作为函数中的参数传递

时间:2012-07-23 02:55:54

标签: c#

在C#中是否可以将类函数(非静态)作为参数传递给函数?

由于某种原因,我在函数下载中遇到编译错误,因为我传递了一个'class / instance'函数作为参数。

例如:

public class MyPlane {
   Texture texture;

   virtual public void OnDownloadPlaneCallBack(WWW www) {
      // perform custom actions when/if file downloads correctly
      texture = www.texture;
   }

   virtual public void download() {
       Downloader.download("www.blah.com", OnDownloadPlaneCallBack);  // this gives a compile error? 
   }
}

public class Downloader {

    public static IEnumerator download(string url, Delegate callback) {
        WWW www = new WWW(url); 

        while(!www.isDone)
            yield return www;

         if (www.isDone) {
            callback.DynamicInvoke(www);
         }
    }
}

2 个答案:

答案 0 :(得分:2)

当然,您可以从实例方法构造委托:这是一个非常强大的功能。您看到的问题与创建委托的特定语法有关 - 使用方法组

您收到编译错误,因为方法组(这是从“裸”方法名称构造委托的正式名称)不能作为“无类型”Delegate的参数传递。

如果您更改download方法的签名以接受Action<WWW>,您的代码将正确编译。您也可以显式地转换方法组,如下所示:

Downloader.download("www.blah.com", (Action<WWW>)OnDownloadPlaneCallBack);

答案 1 :(得分:1)

public string CanReceiveFunction(Func<int, string> func) {
    if (func != null) return func(5);
}

public string CanConvertIntToString(int a) {
    return "here is the result: " + a;
}

public void Main() {
    var result = CanReceiveFunction(CanConvertIntToString);
    Console.WriteLine(result);
}