为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用反射获取变量名?

/ 猿问

如何使用反射获取变量名?

SMILET 2019-11-15 11:00:17

例如,


static void Main()

{

    var someVar = 3;


    Console.Write(GetVariableName(someVar));

}

该程序的输出应为:


someVar

如何使用反射来实现?


查看完整描述

3 回答

?
莫回无

用反射不可能做到这一点,因为一旦编译为IL,变量就不会有名称。但是,您可以使用表达式树并将变量提升为闭包:


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));

}

请注意,这非常慢,因此请不要在应用程序的性能关键路径中使用它。每次运行此代码时,都会创建多个对象(这会导致GC压力),并且在幕后将调用许多非固定方法,并使用一些重反射。


有关更完整的示例,请参见此处。


更新


在C#6.0中,将nameof关键字添加到该语言中,这使我们可以执行以下操作:


static void Main()

{

    var someVar = 3;


    Console.Write(nameof(someVar));

}

显然,这要方便得多,并且以相同的代价将字符串定义为常量字符串文字即可。


查看完整回答
反对 回复 2019-11-15
?
哈士奇WWW

您不能使用反射。GetVariableName传递了数字3,而不是变量。您可以通过对IL进行代码检查来做到这一点,但这可能太难了。


查看完整回答
反对 回复 2019-11-15
?
料青山看我应如是

GetVariableName(() => someVar)使用Reflector编译的地方寻找自己。每次运行此代码时,都会创建多个对象,并在其表面下调用了许多非固定方法,并使用了一些沉重的反映。使用表达式树不是免费的。

查看完整回答
反对 回复 2019-11-15

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信