C#如何从另一个类中调用变量名 附示例代码与实现需求说明
实现方案
原代码存在编译层面的逻辑错误:
nameof是编译期常量解析语法,只能识别当前作用域内的符号,Name类构造函数的作用域中不存在Jack变量,代码无法通过编译,也不可能直接拿到外部实例的变量名。
下面提供两种可落地的实现方式:
1. 构造函数显式传参(全版本C#兼容,生产环境优先推荐)
没有任何语法黑魔法,兼容性最高,逻辑清晰可维护:
class MainClass { public static void Main() { Name Jack = new Name(nameof(Jack)); Jack.Speak(); // 输出:Hello Jack. Name Joe = new Name(nameof(Joe)); Joe.Speak(); // 输出:Hello Joe. } } class Name { private readonly string _valueName; // 构造函数接收外部传入的变量名 public Name(string valueName) { _valueName = valueName; } public void Speak() { Console.WriteLine($"Hello {_valueName}."); } }
2. 表达式树实现(兼容C# 4.0+版本,无需手动传nameof)
适合不支持C# 10的旧项目使用,省略手动写nameof的步骤:
class MainClass { public static void Main() { Name Jack = new Name(() => Jack); Jack.Speak(); // 输出:Hello Jack. Name Joe = new Name(() => Joe); Joe.Speak(); // 输出:Hello Joe. } } class Name { private readonly string _valueName; public Name(System.Linq.Expressions.Expression<Func<Name>> expr) { _valueName = ((System.Linq.Expressions.MemberExpression)expr.Body).Member.Name; } public void Speak() { Console.WriteLine($"Hello {_valueName}."); } }
注意事项
- 表达式树自动获取变量名的方案依赖编译期符号信息,如果项目开启了代码混淆,变量名会被篡改导致输出异常。
- 生产环境优先选择第一种显式传参方案,稳定性和可维护性最高。
内容的提问来源于stack exchange,提问作者Bash
相关产品推荐
相关产品推荐

