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
相关产品推荐
相关产品推荐

