2017-11-01 10 views
0

私は実行時に定義するデリゲートを持っています。辞書に特定のキーが含まれているかどうかを確認したい。デリゲートパラメータの1つが辞書へのrefであるため、辞書は常に最新のバージョンです(フリーズコピーではありません)。C#デリゲート参照なしでオブジェクトフィールドの値を使用

しかし、参照するキーはobjectフィールドですが、そのオブジェクトにrefを渡したくありません。私はちょうどフィールド値をつかみ、それが定数(凍結コピー)であるかのように使用したい。

これは正確なコードスニペットです。私はnetControllerにrefを渡します。これはContainsID()を使って何かをチェックすることができます。 IDパラメータはmsgオブジェクトから来ますが、コンテナオブジェクトへの参照なしで値を使用したいだけです。

ncこのデリゲートに範囲にありますが、msgではありません。これは可能か、すべてをパラメータとして渡す必要がありますか?

注:私は辞書ですが、実際には辞書のようなオブジェクトです。 ContainsID()ContainsKey()のラッパーです。この部分については心配しないでください。

答えて

1

これは、代理人による変数の暗黙的なキャプチャと呼ばれ、間違いなく可能です。

限りmsgは、デリゲートを作成する行外スコープ内にあるように、C#はそれをキャプチャし、あなたのコード内で使用させます:上記の方法

Func<Controller,bool> MakeChecker(Message msg) { 
    return nc => nc.ObjectRegister.ContainsID(msg.parentObjectID); 
} 

が作成するコンテキストから暗黙的にmsgキャプチャデリゲートをデリゲートパラメータとして渡すのではなく、デリゲートをデリゲートします。私は、匿名デリゲートの構文の代わりに、ラムダ構文を使用:

Func<Controller,bool> MakeChecker(Message msg) { 
    return delegate (netController nc) { 
     return nc.ObjectRegister.ContainsID(msg.parentObjectID); 
    } 
} 

私は、デリゲートにこれを保存するにはどうすればよいですか?このよう

:私は、その構文で混乱ビットが、そこにどこかに割り当ててはいけませんよ

Message msg = ... 
Func<Controller,bool> myChecker = MakeChecker(msg); 
+0

?これをデリゲートにどのように格納しますか? – Oliver

+0

@Oliver編集をご覧ください。 – dasblinkenlight

+0

私は厚いですか、それともまだ何か不足していますか? '' 'Func <コントローラ、ブール> MakeChecker(メッセージmsg){ return nc => nc.ObjectRegister.ContainsID(msg.parentObjectID); } '' 'は私のために妥協しません。私は.net 2.5を使用しています、申し訳ありませんが、私は言及を忘れてしまった。 メッセージは、コンテキストでは無効な型です。 が必要です。または= returnステートメントが、メイン関数を含む(および問題を引き起こしている)からの戻りを試みています。 – Oliver

関連する問題