2011-10-20 16 views
1

私は "voidメソッド(文字列)"署名を持つ第三者代理人を持っています。 問題は、追加の追加情報をMySubscribedMethodに渡したい/必要とすることです(簡単にするためにMyIntArgと言います)。私はサブスクリプション時にこの情報を知っていますが、明らかにMySubscribedMethodパラメーターリストを変更することはできません。C#第三者Delagate署名への引数の追加

ThirdPartyClass.ThirdPartyDelagate += MySubscribedMethod; // Want to provide MyIntArg 
public void MySubscribedMethod(string Arg) {} // Would like to receive MyIntArg 

誰もこのタイプの問題に対して優雅な回避策を知っていますか?

おかげで、

答えて

3

これは、のために閉鎖を設計したものです:C#コンパイラは、魔法のあなたがThirdPartyDelegate

呼び出されたときに myIntArgMySubscribedMethodに渡されることを保証するために必要なすべてのインフラストラクチャを作成します

int myIntArg = whatever; 
ThirdPartyClass.ThirdPartyDelagate += s => MySubscribedMethod(s, myIntArg); 

public void MySubscribedMethod(string Arg, int intArg) {} 

(ループ内でこれを使用している場合や変更している場合は、実際の値が渡される正確な値にはさまざまな部分があります。デリゲートを割り当てた後の10。詳細については、thisをご覧ください。

+0

大変感謝しています。関心のある人のために私はクロージャの良い定義をhttp://www.codethinked.com/c-closures-explainedで見つけました – aidesigner

+0

クロージャの作成時にコピーされたmyIntArgの値はクロージャ(pun)の値です。たとえば、myIntArgがデリゲートが呼び出される前に変更された参照型の場合、元の値または変更された値が返されますか? – aidesigner

+0

変更されたもの。 'MySubscribedMethod'への引数として渡される値は、closureが作成されたときの '元の'値ではなく、そのpoint_の変数_の値です。 – thecoop

関連する問題