2012-07-23 144 views
2

在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); 
     } 
    } 
} 
+1

'虚拟公共OnDownloadPlaneCallBack'应该是'虚拟公共无效OnDownloadPlaneCallBack'。 – dasblinkenlight 2012-07-23 03:01:57

+0

使用'Action '作为回调。此外,循环后的“if”检查不是必需的。 – Siege 2012-07-23 03:04:09

回答

2

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

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

如果将download方法的签名更改为接受Action<WWW>,则代码将正确编译。您也可以明确投出方法组,如下所示:

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

是的。

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); 
} 
相关问题