You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:36:05