変数名の動的取得: Reflection と C# 6.0 を使用した代替案の探索 nameof
中間にコンパイルされた変数の名前の取得言語 (IL) はプログラミングにおける一般的な課題です。この記事では、実行時に型とメンバーに関するメタデータを検査できる .NET の強力な機能であるリフレクションを利用して、この問題に対処する方法を詳しく説明します。
リフレクションの制限
最初は、リフレクションを利用して変数名を取得することを検討します。ただし、コンパイル後、変数の名前は IL に保持されないことに注意することが重要です。その結果、リフレクションのみに依存しても、望ましい結果は得られません。
式ツリーとクロージャの入力: 回避策
リフレクションの制限にもかかわらず、独創的な回避策。式ツリーを使用することにより、変数をクロージャにプロモートできます。この手法は基本的にコンパイル時に変数のコンテキストをキャプチャし、後で GetVariableName
実装と使用法
このアプローチを示す例を次に示します。
static string GetVariableName<T>(Expression<Func<T>> expr) { var body = (MemberExpression)expr.Body; return body.Member.Name; } static void Main() { var someVar = 3; Console.Write(GetVariableName(() => someVar)); }
このメソッドは、本文から MemberExpression インスタンスを抽出することによって動作します。提供されたラムダ式の。 MemberExpression の Member プロパティは、変数の名前を保持します。
欠点とパフォーマンスに関する考慮事項
この回避策はリフレクションの制限を回避しますが、パフォーマンス上の欠点も伴います。複数のオブジェクトの作成、過剰な非インラインメソッド呼び出し、およびリフレクションの多用により、遅延が発生する可能性があります。したがって、パフォーマンスが重要なコード パスではこのアプローチを使用しないことをお勧めします。
C# 6.0 のキーワード: よりシンプルなソリューション
C# 6.0 の登場によりの場合、はるかに単純な解決策が登場しました。それは、nameof キーワードです。このキーワードは、コンパイル時に変数、プロパティ、またはメソッドの名前にアクセスするための簡潔で便利な方法を提供します。
元の例では、以下に示すように、nameof を使用して変数名を簡単に取得できるようになりました。
static void Main() { var someVar = 3; Console.Write(nameof(someVar)); }
nameof キーワードは GetVariableName メソッドと同じ機能を提供しますが、改良されています。
結論
.NET で変数名を取得するには、慎重な検討が必要です。リフレクション ツリーと式ツリーは実行時に変数名を取得するための回避策を提供しますが、パフォーマンスへの影響を考慮する必要があります。対照的に、C# 6.0 の nameof キーワードは、これらのパフォーマンス上の懸念を解消し、このタスクのより効率的なソリューションとして機能します。
以上がC# で変数名を動的に取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。