2009-08-28 145 views
1

目前,我有這樣的:參數傳遞到委託功能

instance = new Class1<Type1>(
       "param1", 
       () => 
       new ViewDataDictionary<Type2>(
        new Class2 
        { 
         Prop1= CreateList(new List<long> { 234 }), 
         Prop2= CreateList(new long[] { 234 }) 
        })); 

我想通過在功能CreateList一個變量來代替。事情是這樣的

long p1 = 123; 
instance = new Class1<Type1>(
        "param1", 
        () => 
        new ViewDataDictionary<Type2>(
         new Class2 
         { 
          Prop1= CreateList(new List<long> { p1}), 
          Prop2= CreateList(new long[] { p1}) 
         })); 

但它給我,如果 我嘗試做上面的序列化錯誤。所有類 都標記爲可序列化。

回答

3

當在lambda表達式引用本地變量,它產生一個閉合件(一個編譯器生成的類,「捕獲」局部變量作爲一個字段)。此次關閉是沒有標記爲可序列化,所以串行化失敗...

相反,你可以改變lambda表達式的類型來接受一個參數,並傳遞價值作爲一個單獨的參數:

long p1 = 123; 
instance = new Class1<Type1>(
       "param1", 
       (prm) => 
       new ViewDataDictionary<Type2>(
        new Class2 
        { 
         Prop1= CreateList(new List<long> { prm }), 
         Prop2= CreateList(new long[] { prm }) 
        }), 
       p1); 
+0

我想把它作爲一個通用代理。可能有一個代理執行的函數,它可能沒有參數或者有更多的參數。我正在考慮有一個對象的數組。但是有更好的方法嗎? – user99322 2009-08-31 13:00:20

+0

那麼,爲了保持類可序列化,你的lambda表達式不能捕獲任何局部變量。所以我看到的唯一解決方案將覆蓋所有情況,即使它不是很方便,也可以使用一組對象(或者一個字典)作爲委託的參數 – 2009-08-31 13:35:31