C#生成可读类型名异常:ICollection<string>返回IEnumerable<string>排查
关于ICollection调用GetInterfaces()不返回自身的问题分析
这是特性设计,不是VS22/.NET7的Bug,也不是遗漏内容。
核心原因
Type.GetInterfaces()方法的作用是返回当前类型实现的接口集合,而非类型本身。ICollection<T>本身是接口,它的定义里继承了IEnumerable<T>和非泛型IEnumerable,所以调用typeof(ICollection<string>).GetInterfaces()只会返回这两个被它实现的接口,不会包含ICollection<T>自身。
修复扩展方法的思路
你的HumanReadableTypeName返回错误结果,是因为逻辑只遍历了GetInterfaces()的返回值,没先检查当前类型本身是否是目标泛型接口。修正步骤:
- 先判断当前类型是否为泛型接口,且泛型定义匹配
ICollection<>、IList<>等目标类型:var type = typeof(ICollection<string>); if (type.IsGenericType) { var genericDef = type.GetGenericTypeDefinition(); if (genericDef == typeof(ICollection<>)) { var argType = type.GetGenericArguments()[0].HumanReadableTypeName(); return $"ICollection<{argType}>"; } // 同理处理IList<>、IEnumerable<>等类型 } - 仅当当前类型不是目标泛型接口时,再去遍历它实现的接口做后续处理。
内容的提问来源于stack exchange,提问作者H.Hasenack
相关产品推荐
相关产品推荐

