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

C#中如何通过nameof获取泛型类的完整名称?

问题分析

你遇到的核心问题是:nameof运算符只会提取标识符的字面名称,对泛型类型或泛型参数,它不会展开为实际的具体类型信息。所以nameof(StateMachine<TTag>)只会返回"StateMachine",而nameof(TTag)在泛型类内部只会返回"TTag"(不是实际的AppStateTag),这两种方式都无法得到你想要的StateMachine<AppStateTag>格式。

解决方案

1. 最简便的方式(.NET Core 3.0+ / .NET 5+)

直接使用typeof(StateMachine<TTag>).Name,在新版.NET中,泛型类型的Name属性会直接返回带具体泛型参数的友好名称:

public class StateMachine<TTag> where TTag : Enum
{
    private readonly ILogger _logger;

    public StateMachine(ILogger logger)
    {
        _logger = logger;
    }

    public void SomeMethod()
    {
        string tag = typeof(StateMachine<TTag>).Name;
        _logger.Log(tag, "日志内容");
    }
}

当实例化为StateMachine<AppStateTag>时,tag的值就是"StateMachine<AppStateTag>",完全符合需求。

2. 兼容旧框架(.NET Framework)

如果项目仍在使用.NET Framework,泛型类型的Name会返回类似"StateMachine1"的格式(1`表示泛型参数数量),需要手动处理:

string genericTypeName = typeof(StateMachine<TTag>).GetGenericTypeDefinition().Name;
string baseName = genericTypeName.Substring(0, genericTypeName.IndexOf('`'));
string tag = $"{baseName}<{typeof(TTag).Name}>";

3. 性能优化(可选)

如果担心重复调用typeof的开销,可以在泛型类的静态构造函数中缓存标签,避免重复计算:

public class StateMachine<TTag> where TTag : Enum
{
    private static readonly string _loggerTag;
    private readonly ILogger _logger;

    static StateMachine()
    {
        _loggerTag = typeof(StateMachine<TTag>).Name;
    }

    public StateMachine(ILogger logger)
    {
        _logger = logger;
    }

    public void SomeMethod()
    {
        _logger.Log(_loggerTag, "日志内容");
    }
}

关键注意点

不要用nameof(TTag)拼接,因为在泛型类内部,nameof(TTag)返回的是字符串"TTag",而不是实例化时的具体类型名(比如AppStateTag),这完全达不到你的要求。必须用typeof(TTag).Name来获取实际的泛型参数类型名称。

内容的提问来源于stack exchange,提问作者stroibot

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 03:15:24