如何获取类实例的变量名?C#代码实现需求咨询
获取C#类实例的变量名并输出对应内容
嘿,这个需求挺实际的——想要让TaskAction的实例知道自己被哪个变量引用,然后在Increment方法里输出对应的变量名对吧?
首先得明确:类实例本身在运行时并不知道自己被哪个变量引用,因为变量名只是编译阶段的标识符,编译后会被转换成内存地址相关的引用,实例本身不会保留这个信息。不过我们可以通过几种变通的方式实现你要的效果:
方案1:构造函数传入变量名(最简单直接)
我们可以给TaskAction类添加一个字段来存储实例的名称,在创建实例的时候把变量名传进去。这里推荐用nameof关键字,避免硬编码字符串,后续变量改名时也能自动同步:
修改后的TaskAction类:
public class TaskAction { private int m_Current; private readonly string _instanceName; // 构造函数接收实例名称 public TaskAction(string instanceName) { m_Current = 0; _instanceName = instanceName; } public void Increment() { m_Current++; // 输出目标格式的内容 Console.WriteLine($"TaskAction {_instanceName} {m_Current}"); } }
然后在Main方法中创建实例时传入变量名:
static void Main() { TaskAction m_first = new TaskAction(nameof(m_first)); m_first.Increment(); // 输出:TaskAction m_first 1 m_first.Increment(); // 输出:TaskAction m_first 2 TaskAction m_Second = new TaskAction(nameof(m_Second)); m_Second.Increment(); // 输出:TaskAction m_Second 1 }
方案2:用表达式树自动解析变量名(更“自动化”)
如果你不想手动传变量名,可以借助表达式树来解析变量的名称,写一个工厂方法来创建实例:
首先添加一个工厂类:
public static class TaskActionFactory { public static TaskAction Create(Expression<Func<TaskAction>> expr) { var memberExpression = expr.Body as MemberExpression; if (memberExpression == null) { throw new ArgumentException("请传入变量表达式,比如 () => 变量名"); } // 从表达式中获取变量名 string variableName = memberExpression.Member.Name; return new TaskAction(variableName); } }
然后在Main方法中这样使用:
static void Main() { var m_first = TaskActionFactory.Create(() => m_first); m_first.Increment(); // 输出:TaskAction m_first 1 m_first.Increment(); // 输出:TaskAction m_first 2 var m_Second = TaskActionFactory.Create(() => m_Second); m_Second.Increment(); // 输出:TaskAction m_Second 1 }
这种方式不需要手动输入变量名,通过表达式树自动解析,不过需要注意变量声明和初始化的顺序,用var可以避免提前声明的问题。
总结
- 方案1简单易懂,维护成本低,适合大多数场景;
- 方案2更优雅,但稍微复杂一点,适合需要大量创建实例且不想重复传参的场景。
内容的提问来源于stack exchange,提问作者Anthony Brown
相关产品推荐
相关产品推荐

