如何获取C#泛型类中泛型类型参数的名称?
获取泛型类定义时的类型参数名称
别用StreamReader读取源码这种绕路的方式啦,.NET的反射API完全能高效解决这个问题——你需要先拿到泛型类型的原始定义,再从中提取类型参数的名称。
核心思路
当你用typeof(MyClass<int>)拿到的是构造后的泛型类型(已经绑定了具体类型int),而我们需要的是它的泛型定义(也就是MyClass<>,还没绑定具体类型的版本)。通过反射获取这个定义后,就能拿到定义时声明的类型参数名称。
实现扩展方法
我们可以给Type类写一个扩展方法,方便直接调用:
using System; using System.Linq; public static class TypeExtensions { // 单泛型参数的情况,返回第一个类型参数的名称 public static string GetTypeParameterName(this Type type) { // 先检查是不是泛型类型 if (!type.IsGenericType) throw new ArgumentException("类型必须是泛型类型"); // 获取泛型定义(比如从MyClass<int>拿到MyClass<>) var genericDefinition = type.GetGenericTypeDefinition(); // 获取定义时的泛型参数,这里取第一个(适合单参数的情况) var typeParameter = genericDefinition.GetGenericArguments()[0]; // 返回参数的名称,就是你要的"Type1" return typeParameter.Name; } // 可选:多泛型参数的情况,返回所有参数名称的列表 public static string[] GetTypeParameterNames(this Type type) { if (!type.IsGenericType) throw new ArgumentException("类型必须是泛型类型"); var genericDefinition = type.GetGenericTypeDefinition(); return genericDefinition.GetGenericArguments() .Select(t => t.Name) .ToArray(); } }
测试代码
和你的示例完全匹配:
class MyClass<Type1> { public Type data; } static void Main() { // 输出:Type1 Console.WriteLine(typeof(MyClass<int>).GetTypeParameterName()); // 如果是多参数的情况 class MultiGeneric<TFirst, TSecond> { } // 输出:TFirst, TSecond Console.WriteLine(string.Join(", ", typeof(MultiGeneric<string, int>).GetTypeParameterNames())); }
关键说明
GetGenericTypeDefinition():将构造后的泛型类型转换为其原始的泛型定义,这一步是核心,因为只有定义里的类型参数才保留着你声明的名称(比如Type1)。GetGenericArguments():在泛型定义上调用时,返回的是定义时的类型参数(不是实际传入的具体类型),它的Name属性就是你要的字符串。
这种方法完全不需要读取源码,纯反射实现,高效又可靠。
内容的提问来源于stack exchange,提问作者Tᴏᴍᴇʀ Wᴏʟʙᴇʀɢ
相关产品推荐
相关产品推荐

