4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MethodInvokerの水平展開…

Posted at

背景

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だけあれば何の問題もない事に今更気づくと云う…

思い付きで手を動かすのは良くないなぁ
でもま、楽しかったから良しとするか、と云うお話

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?