2012-07-23 139 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); 
} 
相關問題