- PR -

C# 引数やローカル変数の名前を取得する方法は?

投稿者投稿内容
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 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;
.....

}
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-02-28 21:45
System.Reflection.LocalVariableInfoは使ったことないですが
無理でしょう。
そもそもインスタンスがないので。。。
kuma
大ベテラン
会議室デビュー日: 2004/02/25
投稿数: 110
投稿日時: 2008-02-28 22:30
ひろしさん、あなたは他人がひろしさんをどのように識別(あだ名等)しているか
その人に教えてもらうこと無しに解りますか?
他人がどのように識別しているかは、
他人に直接聞いてもらうか、どのように識別しているか教えてもらい記憶しておく必要がありますよね
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2008-02-28 22:34
引用:

ひろしさんの書き込み (2008-02-28 21:34) より:
ローカル変数のインスタンスから自分自身の名前を取得したい。



ビルドされた後にはローカル変数に名前はありませんから、
取得する方法もありません。

LocalVariableInfo クラスのドキュメントにある記述:

> ローカル変数名は、メタデータ内で永続化されません。
> MSIL (Microsoft Intermediate Language) では、
> ローカル変数にはローカル変数シグネチャ内での位置によってアクセスします。

つまり、MSILレベルでは0番目の変数、1番目の変数、・・・というような識別の仕方をしているということです。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-02-29 09:28
<ネタ>
ソースファイルがあれば、いけんじゃね?

CodeDom介して、ソースコード解析すれば、ローカル変数名取れるよ、きっと。
でも、実行中のメソッドをいかにして取得するかが問題。
例外でも発行して、スタックトレースでも解析するか。
</ネタ>
#ネタだから本気にしないように....。
ykSiR
会議室デビュー日: 2006/10/03
投稿数: 16
投稿日時: 2008-02-29 10:42
引用:

ひろしさんの書き込み (2008-02-28 21:34) より:
// リファクタリングでparam1の名前を変更すると
// 文字列"param1"が古いままでバグになってしまう


この目的を達成するだけならローカル変数名から取得するのではなくメソッドのパラメータ名を取得する方法で実現できます。

現在のメソッドのSystem.Reflection.MethodBaseを取得すれば、そのメソッドのパラメータにもアクセスできますので、その方法でいかがでしょう?
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 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 ]
ひろし
ぬし
会議室デビュー日: 2002/09/16
投稿数: 390
お住まい・勤務地: 兵庫県
投稿日時: 2008-02-29 22:58
ご回答ありがとうございます。
引数の名前を取得する方法は勉強になりました。

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