3

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

出于某种原因,我在函数下载中遇到编译错误,因为我将“类/实例”函数作为参数传递。

例如:

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

2 回答 2

3

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

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

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

Downloader.download("www.blah.com", (Action<WWW>)OnDownloadPlaneCallBack);
于 2012-07-23T03:00:38.327 回答
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);
}
于 2012-07-23T03:03:08.727 回答