- - PR -
C# 引数やローカル変数の名前を取得する方法は?
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2008-02-28 21:34
ローカル変数のインスタンスから自分自身の名前を取得したい。
System.Reflection.LocalVariableInfoを使えば、メソッド内の ローカル変数のリストを取得できますが、ローカル変数のイン スタンスから自分自身の名前を導き出せませんでした。 サンプルコードを修正して、リファクタリングでローカル変数名 を変更しても、新しいローカル変数名の名前の文字列が取得で きるような実装方法にしたい。 サンプルコード // param1インスタンスから自分自身の名前、つまり"param1"を、 // indexインスタンスから自分自身の名前、つまり"index"を // を取得したい。 // // リファクタリングでparam1の名前を変更すると // 文字列"param1"が古いままでバグになってしまう public void f(int param1,int param2) { if (param1 < 0 || param1 > 100) { string paramName = "param1"; string message = "パラメータが不正です"; throw new System.ArgumentOutOfRangeException("param1",param1,message); } ..... int index = 0; ..... } | ||||
|
投稿日時: 2008-02-28 21:45
System.Reflection.LocalVariableInfoは使ったことないですが
無理でしょう。 そもそもインスタンスがないので。。。 | ||||
|
投稿日時: 2008-02-28 22:30
ひろしさん、あなたは他人がひろしさんをどのように識別(あだ名等)しているか
その人に教えてもらうこと無しに解りますか? 他人がどのように識別しているかは、 他人に直接聞いてもらうか、どのように識別しているか教えてもらい記憶しておく必要がありますよね | ||||
|
投稿日時: 2008-02-28 22:34
ビルドされた後にはローカル変数に名前はありませんから、 取得する方法もありません。 LocalVariableInfo クラスのドキュメントにある記述: > ローカル変数名は、メタデータ内で永続化されません。 > MSIL (Microsoft Intermediate Language) では、 > ローカル変数にはローカル変数シグネチャ内での位置によってアクセスします。 つまり、MSILレベルでは0番目の変数、1番目の変数、・・・というような識別の仕方をしているということです。 | ||||
|
投稿日時: 2008-02-29 09:28
<ネタ>
ソースファイルがあれば、いけんじゃね? CodeDom介して、ソースコード解析すれば、ローカル変数名取れるよ、きっと。 でも、実行中のメソッドをいかにして取得するかが問題。 例外でも発行して、スタックトレースでも解析するか。 </ネタ> #ネタだから本気にしないように....。 | ||||
|
投稿日時: 2008-02-29 10:42
この目的を達成するだけならローカル変数名から取得するのではなくメソッドのパラメータ名を取得する方法で実現できます。 現在のメソッドのSystem.Reflection.MethodBaseを取得すれば、そのメソッドのパラメータにもアクセスできますので、その方法でいかがでしょう? | ||||
|
投稿日時: 2008-02-29 18:03
なるほど。出来ますね。 //自メソッドの第一引数名を取得 string paramName = (new System.Diagnostics.StackTrace()).GetFrame(0).GetMethod().GetParameters()[0].Name; //改良版 string paramName = System.Reflection.MethodBase.GetCurrentMethod().GetParameters()[0].Name; [ メッセージ編集済み 編集者: todo 編集日時 2008-02-29 18:24 ] | ||||
|
投稿日時: 2008-02-29 22:58
ご回答ありがとうございます。
引数の名前を取得する方法は勉強になりました。 |
1|2|3
次のページへ»