No.1ベストアンサー
- 回答日時:
変数といえば、「フィールド」「引数」「ローカル変数」がありますがどれでしょうか?
私の調べた範囲では、
「フィールド」は可能
「引数」はNameからインスタンスが取れないので無理
「ローカル変数」はNameも取れないので無理(コンパイルした時点で名前を保持していない?)
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
(new myClass()).foo("引数");
}
}
class myClass
{
string s1 = "フィールド";
public void foo(string s2)
{
string s3 = "ローカル変数";
//フィールドの情報
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields) {
object v = field.GetValue(this);
Console.WriteLine("[field]" + field.Name + "=" + v +"," + (v == (object)s1));
}
//引数の情報
ParameterInfo[] parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters) {
Console.WriteLine("[parameter]" + parameter.Name);
}
//ローカル変数の情報
IList<LocalVariableInfo> localVariables = MethodBase.GetCurrentMethod().GetMethodBody().LocalVariables;
foreach (LocalVariableInfo localVariable in localVariables) {
Console.WriteLine("[localVariable]" + localVariable.LocalType);
}
}
}
}
この回答への補足
public class Debugger
{
static protected List<Abstract> writers = new List<Abstract>();
static private string indent = "\t";
static public string Indent
{
get { return indent; }
set { indent = value; }
}
static public void Dump(object src)
{
#region "デフォルトでライターの追加"
StringBuilder output = new StringBuilder();
output.Append(RecursiveGetBuffer(src, 0, -1));
foreach (Abstract writer in writers)
{
// System.Windows.Forms.MessageBox.Show(output.ToString());
// System.Console.WriteLine(output.ToString());
// など
writer.Write(output.ToString());
}
}
static public void AddWiter(Abstract writer)
{
writers.Add(writer);
}
static private string GetMultiIndent(int count)
{
string s = "";
for (int i = 0; i < count; i++)
{
s += Indent;
}
return s;
}
static private string GetFormatType(object obj)
{
return "[" + obj.GetType().ToString() + "] => ";
}
static private string RecursiveGetBuffer(object src, int recursive, int index)
{
StringBuilder output = new StringBuilder();
if (src == null)
{
// 本当は型情報などを取得して表示したいけど、nullなのでやむおえず
output.Append(GetMultiIndent(recursive) + " null" + Environment.NewLine);
}
else
{
Type type = src.GetType();
if (type.IsPrimitive || type == typeof(string) || type.IsEnum)
{
if (index < 0)
{
output.Append(GetMultiIndent(recursive) + GetFormatType(src) + src + Environment.NewLine);
}
else
{
// 配列の中身を表示する場合
output.Append(GetMultiIndent(recursive) + "[" + index + "]" + " => " + src + Environment.NewLine);
}
}
else
{
output.Append(GetMultiIndent(recursive) + GetFormatType(src) + Environment.NewLine + GetMultiIndent(recursive) + "(" + Environment.NewLine);
if (type.IsArray)
{
int n = 0;
foreach (object temp in (Array)src)
{
recursive++;
output.Append(RecursiveGetBuffer(temp, recursive, n));
recursive--;
n++;
}
}
else if (type.IsGenericType)
{
int n = 0;
#region "C#2.0では動的型がないためそれぞれの型を用意する。C#4.0で可能?"
List<string> stringSrc = src as List<string>;
List<int> intSrc = src as List<int>;
if (stringSrc != null)
{
foreach (object temp in stringSrc)
{
recursive++;
output.Append(RecursiveGetBuffer(temp, recursive, n));
recursive--;
n++;
}
}
else if (intSrc != null)
{
foreach (object temp in intSrc)
{
recursive++;
output.Append(RecursiveGetBuffer(temp, recursive, n));
recursive--;
n++;
}
}
#endregion
}
else if (type.IsClass)
{
recursive++;
foreach (FieldInfo fi in type.GetFields())
{
object value = fi.GetValue(src);
output.Append(RecursiveGetBuffer(value, recursive, -1));
}
recursive--;
}
output.Append(GetMultiIndent(recursive) + ")" + Environment.NewLine);
}
}
return output.ToString();
}
}
ご返答ありがとうございます。
取得したいのは引数だと思います。
すいません、お題から逸れるかもしれませんが、
そもそもなんで変数名を取得したいと思ったかというと、
PHPでいうvar_dump関数のような、
変数やクラスや配列などを引数に渡して表示してくれる関数を
C#でも作りたいと思ったからです(var_dumpもローカル変数名などは表示されませんけど・・・)
一応探したりしたのですが似たような機能はなかったので、
VisualStadioのデバッグの変数表示機能も使ってみたのですが、
見易さと使い勝手から、やっぱりvar_dumpのような一発で全体像が見えるような
機能がほしいと思いました。
そこで自分なりに考えてみたのですが、
※クラスの定義は補足を参考にしてください
string s1 = "test";
Debugger.Dump(s1);
List<int> list = new List<int>();
list.Add(11);
list.Add(22);
Debugger.Dump(list);
TestClass tc = new TestClass();
tc.a = 1;
tc.testClass = new TestClass();
tc.testClass.a = 2;
Debugger.Dump(tc);
型を気にせず引数に渡して展開された変数を表示します。
申し訳ないのですが、このようなことをふまえて
アドバイス頂けないでしょうか?
代わりになるやり方(関数)など知っていましたら教えてもらいたいです。
No.2
- 回答日時:
ご返答ありがとうございます。
なるほど、同じような質問があったんですね・・・
試してみましたが、たしかに多次元配列はエラーがでましたが
ジャグ配列は大丈夫でした。
あとはこのやり方を利用して自分なりにカスタマイズ(インデントの幅を調節できたりしたら理想ですね)
していきたいと思います。参考になりました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) 稀に1円合いません? Sheet1から金額と個数を貼り付ける下記コードで、金額を切り上げるコードを何 3 2022/09/05 15:11
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 別シートのデータを参照して値を入れたい。 まとめデータシートのC列D列の値を商品一覧シートのコードが 7 2022/08/17 13:20
- Visual Basic(VBA) excel vbaでvlooupの変数がわかりません。 7 2022/05/30 09:35
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- PHP $_SESSIONに渡した後はそのまま使っても問題ありませんか? 3 2022/11/08 22:17
- その他(コンピューター・テクノロジー) 【Tableau Desktop】文字列から8桁の数字を日付型(yyyyMMdd)として取得 1 2023/07/31 10:17
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SQLで複数のテーブルと結合した...
-
2つ目のレコードの値を取得す...
-
Access 2010で実行時エラー3061
-
日付と文字列を条件としてDLook...
-
クリスタルレポート(8.5)の書式...
-
INT64対応のprintf系関数はあり...
-
クリスタルレポートで困ってい...
-
DataTableに特定のフィールドが...
-
accessでフィールド追加のあと...
-
オートナンバー型を抽出条件に...
-
Accessの画像挿入のVBAコード
-
ADOX フィールドのRequiredプ...
-
Accessのフィールド名に半角括...
-
(ADO)フィールド名から取得し...
-
エクセルVBAでSQLを使ってアク...
-
アクセスのクエリに、VLOOKを設...
-
NULLを含む文字列の結合で...
-
Access VBA 添付型フィールド
-
VB.NETのOleDbCommandにて文字...
-
AccessのDAOでフィールド名を配...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessのフィールド名に半角括...
-
DataTableに特定のフィールドが...
-
accessでフィールド追加のあと...
-
INT64対応のprintf系関数はあり...
-
2つ目のレコードの値を取得す...
-
Access 2010で実行時エラー3061
-
日付と文字列を条件としてDLook...
-
AccessのDAOでフィールド名を配...
-
SQLで複数のテーブルと結合した...
-
テーブルのデータ型の変更がで...
-
フィールド名をループの添え字...
-
クリスタルレポート(8.5)の書式...
-
AccessVBAで他テーブルのデータ...
-
Accessの画像挿入のVBAコード
-
アクセスでADO 並べ替えが適用...
-
NULLを含む文字列の結合で...
-
クリスタルレポートで文字列の...
-
ACCESSデータベースにV...
-
ノーツ:ユーザ名から別名を取...
-
Access クエリで変数を参照する...
おすすめ情報