機能

2009-08-28 7 views
1

を委任するパラメータを渡す私は現在、この持っている:私は代わりに、関数CreateListに変数を渡したい機能

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

を。この

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

ラムダ式のローカル変数を参照すると、閉包(ローカル変数をフィールドとして「キャプチャ」するコンパイラ生成クラス)が生成されます。直列化が失敗した...

代わりに、あなたはパラメータを受け入れるようにラムダ式のタイプを変更し、別のパラメータとして値を渡すことができるように、この閉鎖は、シリアル化可能としてマークされていない:

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

+0

さて、クラスをシリアライズ可能にするために、ラムダ式はローカル変数を取り込んではいけません。だから、すべてのケースをカバーする唯一の解決策は、非常に便利ではないにしても、デリゲートへのパラメータとしてオブジェクトの配列(あるいは多分辞書)を使うことです –