2015-02-05 55 views
0

我有這個代碼,我試圖通過另一個調用包裝一個匿名函數,所以當它實際上是返回的包裝的值,而不是原始函數的。用另一個調用包裝匿名函數

但是在下面的代碼中,我在上次調用中得到了一個NullPointerException。我相信我沒有做正確的事情,但是打敗了我。

class Program 
{ 
    public class MyClass 
    { 
     public int MyProp { get; set; } 
    } 

    private static List<Func<MyClass, object>> Calls; 

    private static object ExtraCall(int obj) 
    { 
     var returnVal = 8; 

     //do some stuff 

     return returnVal; 
    } 

    static void Main(string[] args) 
    { 
     Calls = new List<Func<MyClass, object>>(); 

     Calls.Add(c => c.MyProp); 

     Func<MyClass, object> func = c => c.MyProp; 
     Calls.Add(c => ExtraCall((int)func(func.Target as MyClass))); 

     var obj = new MyClass(){ MyProp = 7 }; 
     var test1 = Calls[0](obj); 
     var test2 = Calls[1](obj); 
    } 
} 
+3

你期望'func.Target'是什麼?注意你如何在第二個lambda表達式中的任何地方不使用'c' - 這應該是一個提示。 – 2015-02-05 17:25:51

回答

2

func.Target爲空,因爲這個委託沒有任何它被調用的實例。你可以嘗試下面的代碼:

Calls.Add(c => ExtraCall((int)func(c))); 
+2

或者更簡單:'Calls.Add(c => ExtraCall((int)func(c)));' – 2015-02-05 17:26:14

+0

@JonSkeet不知何故VS向我顯示錯誤,說'未知變量',所以我加了'tmp'。更新我的答案,謝謝。 – andreycha 2015-02-05 17:48:05

+0

適合我編譯 - 我懷疑你有錯別字。 – 2015-02-05 17:49:30