例如,
static void Main()
{
var someVar = 3;
Console.Write(GetVariableName(someVar));
}
Run Code Online (Sandbox Code Playgroud)
该程序的输出应为:
someVar
Run Code Online (Sandbox Code Playgroud)
如何使用反射实现这一目标?
Ste*_*ven 65
使用反射无法做到这一点,因为变量在编译为IL后将没有名称.但是,您可以使用表达式树并将变量提升为闭包:
static string GetVariableName<T>(Expression<Func<T>> expr)
{
var body = (MemberExpression)expr.Body;
return body.Member.Name;
}
Run Code Online (Sandbox Code Playgroud)
您可以按如下方式使用此方法:
static void Main()
{
var someVar = 3;
Console.Write(GetVariableName(() => someVar));
}
Run Code Online (Sandbox Code Playgroud)
请注意,这非常慢,因此请勿在应用程序的性能关键路径中使用它.每次运行此代码时,都会创建几个对象(这会导致GC压力),并且在封面下会调用许多非可嵌入的方法并使用一些重反射.
有关更完整的示例,请参见此处.
UPDATE
使用C#6.0,nameof关键字将添加到语言中,这使我们可以执行以下操作:
static void Main()
{
var someVar = 3;
Console.Write(nameof(someVar));
}
Run Code Online (Sandbox Code Playgroud)
这显然更方便,并且具有相同的成本将字符串定义为常量字符串文字.
| 归档时间: |
|
| 查看次数: |
38242 次 |
| 最近记录: |