リファクタリング セーフな方法で実行時にローカル変数 (およびパラメーター) の名前を取得することに興味があります。次の拡張メソッドがあります。
public static string GetVariableName<T>(Expression<Func<T>> variableAccessExpression)
{
var memberExpression = variableAccessExpression.Body as MemberExpression;
return memberExpression.Member.Name;
}
…これは、ラムダ式を通じてキャプチャされた変数の名前を返します。
static void Main(string[] args)
{
Console.WriteLine(GetVariableName(() => args));
// Output: "args"
int num = 0;
Console.WriteLine(GetVariableName(() => num));
// Output: "num"
}
ただし、これが機能するのは、C# コンパイラが匿名関数でキャプチャされたローカル変数 (およびパラメーター) を、舞台裏でコンパイラによって生成されたクラス内の同じ名前のインスタンス変数に昇格させるためです ( Jon Skeetによる)。そうでない場合、Body
toのキャストMemberExpression
は失敗します。これは、MemberExpression
フィールドまたはプロパティへのアクセスを表すためです。
この変数の昇格は文書化された動作ですか、それとも実装の詳細はフレームワークの他のバージョンで変更される可能性がありますか?
注:この質問は、引数の検証に関する以前の質問の一般化です。