- - PR -
メソッドの呼出元インスタンスの取得方法がわかりません
«前のページへ
1|2|3
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-04-28 10:58
っと、書き込んでから気が付きましたけど、もしかしてMainFormの方を変更できないってことなんですかね?
それなら私の案はだめですね。 | ||||
|
投稿日時: 2006-04-28 11:08
大人の事情なんて上等なもんじゃないでしょ。
浸水した後のことなんかしらん、といって、せっせと泥船を作ってるんですよ。(断言) まともなアドバイスがつくことを期待するのがそもそも無理かと。 | ||||
|
投稿日時: 2006-04-28 19:50
とりあえずは、インスタンスを渡すなり、識別可能な情報を渡せる
オーバーロードをこさえればいいんじゃないですかね? public void TestClassMethod(foo bar){ //処理 } VB6で開発をしていたときは、Optional変数を追加しまくりでしたが | ||||
|
投稿日時: 2006-04-28 22:37
^まともな^期待通りの ではないでしょうか。 「まともなアドバイス=インスタンスを渡す」 だと思います。 | ||||
|
投稿日時: 2006-04-29 09:29
ロニーさんの言うようなシーンは普通にあり得ることだと思います。 しかし仕様の変更が可能なのであれば、そうすることをお勧めします。 今回の場合は技術というより、難解なパズルを解いている印象を受けました。 ログを記録していないサーバーで、誰がアクセスしに来たのか調べる方法は無いか? と聞かれているのと大差がないような。 と言う事は、仮に方法があったとしても、その方法を使うことで「以前の仕様を変 更したくないから、他の仕様をわかりにくく保守性の低いトリッキーなものにする」 ことになってしまいます。 これはコストの面でも決して低いものではないかと思いました。 | ||||
|
投稿日時: 2006-04-29 12:29
チャチャになりますが、プロジェクトXの見すぎです。 できるのかもしれませんが、キレイではありません。もっとも、キレイでなくてもよくて、かつ、回避することに価値があるのならば、技術屋としてはやりがいはありますね。 キレイではないというのは、普通の設計論では、呼び出し元の情報が呼び出され側で必要ならば、呼び出し元で明示的に伝えるものだからです。ぷらっとふぉーむによっては API にそういう情報を呼び出され側で勝手に取得できるものがあるかもしれませんが、それは普通のアプリケーションで使うものではなく、デバッグ用など特殊な用途に使うためのものです。 普通は、仕様を変えることをお勧めします。 以下は、なんとかやりくりしてみるだけを考えた場合の話です。 (1) MainForm の button1_Click 中で Form のインスタンスを new していますが、これはスタックに乗らない情報です。したがって、test と button1_Click の間の因果関係が失われています。ただ、Form の作りによっては Show された段階で、コンテキストを見て、その情報を使っている場合があります。たとえば親ウィンドウを取得するためになど。もしかしたら、そういう情報が使える可能性はあります。もっとも、こういう Form の作りだったら、その時点でそれはそれで汚いです。 (2) 一方、test から TestClassMethod を呼んでいますが、これはスタックに乗っている情報であるため、TestClassMethod の中でスタックトレースを解析すれば、比較的容易に呼び出し元が test であることが分かるでしょう。 要求仕様が良く分からないのですが、なにを識別されたいのでしょうか? Form のインスタンスを区別したいということは、結局は、button1_Click なのか button2_Click なのかを区別したいということでしょうか?だとしたらやはり上記の(1)と(2)の両方を解決する必要があり、とくに(1)が困難です。(2)だけだったらまだ良かったのですが。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||
|
投稿日時: 2006-04-29 22:44
unibonさんの指定どおり、Formのインスタンスはスタックにのらないので残念ながらインスタンスを取得することは普通に考えて無理です。
ただ、今回は幸運?にもWindowsフォームなので、WndProcをオーバーライドすれば呼び出しもとをグローバルにアクセス可能な変数に設定することができます。あとは、そのグローバルに設定した内容を参照すればたぶんOKだと思います。 protected override void WndProc(ref Message m) { CurrentProcForm = this; base.WndProc(ref m); } なお、グローバルにアクセス可能な変数の仕組みとしてはCallContextを利用するかThreadStatic属性をつけたstatic変数の方が無難かもしれません。UIスレッドのアクセスで限定されるのであれば普通のstatic変数でOKかな。分かる方フォローお願いします。 ではでは |
«前のページへ
1|2|3