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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:48:17