Posted at

MethodInvokerの水平展開…

More than 3 years have passed since last update.


背景

BackgroundWorker使ってると、裏タスク側からフォームにアクセスしたくなりますよね

そんな時Control.Invokeを使え!ってのは余りにも有名

でも、delegateを毎回定義するの大変なんですよー

基本1回しか使わないのでメソッド定義するのも悩ましくてさ


対策

っても何の事はもなく、MSもきちんと考えてくれてました

delegate void MethodInvoker();

と云うのが標準で定義されているので、それと匿名関数を組み合わせれば…

this.Invoke((MethodInvoker)delegate() {

textBox1.Text = "むふっ";
});

はい、出来上がり


展開

そこでふと考えた…

パラメータ渡したかったり、結果を受け取りたいときはどうすれば良いんだ!

自分で delegate 定義しろって事かい?

よーし、何とかしてやろうじゃないか

delegate void MethodInvoker<T1>(T1 arg1);

delegate void MethodInvoker<T1, T2>(T1 arg1, T2 arg2);
delegate void MethodInvoker<T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
:

序に…

delegate T0 FunctionInvoker<T0>();

delegate T0 FunctionInvoker<T0, T1>(T1 arg1);
delegate T0 FunctionInvoker<T0, T1, T2>(T1 arg1, T2 arg2);
delegate T0 FunctionInvoker<T0, T1, T2, T3>(T1 arg1, T2 arg2, T3 arg3);
:

引数は arg9 位まで用意しとけば良いかな、ふふん楽勝楽勝

まったく Console.WriteLine のオーバーロードみたいに引数9つ分位用意しといてくれればいいのに

全くMSも気が利かない


結果

いっぱい定義並べて満足しました

string name = this.Invoke((FunctionInvoker)delegate<string>() {

return textBox2.Text;
});

って確かに使えるし、満足満足………





……

でもさー

よーく考えたら画面部品じゃなければ普通にアクセスできるんですよねー

わざわざパラメータで渡さなくたって、わざわざ戻り値で返さなくたって、そこら辺の変数に触り放題じゃん

という事で、標準定義のMethodInvokerだけあれば何の問題もない事に今更気づくと云う…

思い付きで手を動かすのは良くないなぁ

でもま、楽しかったから良しとするか、と云うお話