- PR -

メソッドの呼出元インスタンスの取得方法がわかりません

投稿者投稿内容
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-04-28 10:58
っと、書き込んでから気が付きましたけど、もしかしてMainFormの方を変更できないってことなんですかね?

それなら私の案はだめですね。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-04-28 11:08
大人の事情なんて上等なもんじゃないでしょ。
浸水した後のことなんかしらん、といって、せっせと泥船を作ってるんですよ。(断言)
まともなアドバイスがつくことを期待するのがそもそも無理かと。
ぎゃふん
会議室デビュー日: 2005/12/01
投稿数: 3
投稿日時: 2006-04-28 19:50
とりあえずは、インスタンスを渡すなり、識別可能な情報を渡せる
オーバーロードをこさえればいいんじゃないですかね?
public void TestClassMethod(foo bar){
//処理
}
VB6で開発をしていたときは、Optional変数を追加しまくりでしたが
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-04-28 22:37
引用:

Edossonさんの書き込み (2006-04-28 11:08) より:

まともなアドバイスがつくことを期待するのがそもそも無理かと。


^まともな^期待通りの

ではないでしょうか。
「まともなアドバイス=インスタンスを渡す」
だと思います。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-04-29 09:29
引用:

ロニーさんの書き込み (2006-04-27 17:34) より:

みなさまのご指摘の通り、現仕様を変更するのが最善の方法だと思います。
ですが、この修正により発生するコストを考慮すると、そう安易に諦めて
仕様変更とするわけにはいかないのです。
技術的に回避不可能、と証明されればやむを得ないのですが、限界まで現状での
回避方法を検討するのも技術屋の仕事の一つだと思っております。


ロニーさんの言うようなシーンは普通にあり得ることだと思います。
しかし仕様の変更が可能なのであれば、そうすることをお勧めします。

今回の場合は技術というより、難解なパズルを解いている印象を受けました。
ログを記録していないサーバーで、誰がアクセスしに来たのか調べる方法は無いか?
と聞かれているのと大差がないような。

と言う事は、仮に方法があったとしても、その方法を使うことで「以前の仕様を変
更したくないから、他の仕様をわかりにくく保守性の低いトリッキーなものにする」
ことになってしまいます。
これはコストの面でも決して低いものではないかと思いました。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-04-29 12:29
引用:

ロニーさんの書き込み (2006-04-27 17:34) より:
技術的に回避不可能、と証明されればやむを得ないのですが、限界まで現状での
回避方法を検討するのも技術屋の仕事の一つだと思っております。


チャチャになりますが、プロジェクト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}
dotnetmemo
常連さん
会議室デビュー日: 2006/04/29
投稿数: 24
投稿日時: 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かな。分かる方フォローお願いします。

ではでは

スキルアップ/キャリアアップ(JOB@IT)