C#中如何从字符串解析运行时未知的.NET类型表达式?
答案
.NET 7 及以上版本提供了内置的 System.TypeName 类型(位于 System.Reflection.Metadata 命名空间),完全匹配你的需求:不需要自行编写解析逻辑,也不要求目标类型在运行时已加载,纯静态即可将类型名称字符串解析为结构化对象。
该类型可以正确覆盖你提到的所有典型类型字符串场景:
- 基础值类型、引用类型的全名称解析
- 数组类型(如
System.Int32[])解析,支持识别多秩数组、交错数组 - 嵌套类型(如
System.Collections.Generic.Dictionary2+KeyCollection,用+`分隔外层类型和嵌套类型)解析 - 构造泛型类型(如
System.Collections.Generic.Dictionary2[System.Int32,System.Int32],用[]`包裹泛型参数列表)解析 - 额外支持指针类型、按引用传递类型等特殊CLR类型签名的解析
解析得到的TypeName实例可以直接访问属性获取内部结构:
- 通过
IsArray、IsGenericType、IsNested、IsPointer等布尔属性快速判断类型类别 - 数组类型可调用
GetArrayRank()获取数组秩,调用GetElementType()获取元素类型对应的TypeName实例 - 泛型类型可调用
GetGenericArguments()获取所有泛型参数的TypeName实例,通过GenericTypeDefinition属性获取开放泛型定义的类型信息 - 嵌套类型可通过
DeclaringType属性获取声明它的外层类型对应的TypeName实例 - 所有节点都可以通过
FullName属性获取对应的完整类型名称字符串
简单使用示例:
using System.Reflection.Metadata; // 解析目标类型字符串 string rawTypeName = "System.Collections.Generic.Dictionary`2[System.Int32,System.Int32[]]"; TypeName parsedType = TypeName.Parse(rawTypeName); // 读取结构信息 Console.WriteLine(parsedType.IsGenericType); // 输出: True Console.WriteLine(parsedType.GetGenericArguments().Length); // 输出: 2 TypeName secondArg = parsedType.GetGenericArguments()[1]; Console.WriteLine(secondArg.IsArray); // 输出: True Console.WriteLine(secondArg.GetElementType().FullName); // 输出: System.Int32
如果你使用的是.NET 6及更低版本,.NET 基础类库没有公开这类无需加载类型的名称解析内置API。如果不想自行编写解析逻辑,可以引用Roslyn编译器的程序集,使用其语法解析模块处理类型名称,但该方案不属于运行时内置工具。
内容的提问来源于stack exchange,提问作者radrow
相关产品推荐
相关产品推荐

