如何通过反射获取类中基于开放泛型类型Gen<T>的属性?
如何通过反射获取基于开放泛型类型
Gen<T>的属性 你遇到的问题核心是开放泛型类型的引用方式——直接写typeof(Gen)会报错,因为Gen<T>是需要类型参数的泛型类,正确引用它的开放泛型定义应该用typeof(Gen<>)(注意尖括号是空的,代表未绑定任何类型参数的泛型模板)。
要筛选出所有类型是Gen<T>构造体的属性,你需要两步判断:
- 首先确认属性的类型是构造泛型类型(也就是已经绑定了具体类型参数的,比如
Gen<int>、Gen<string>) - 然后检查该构造泛型类型的泛型定义是否等于开放泛型的
Gen<>
下面是完整的可运行代码示例:
// 你的泛型类定义 public class Gen<T> { public T Value { get; set; } } // 使用泛型的类 public class Thing { public Gen<int> GenIntProperty { get; set; } public Gen<string> GenStringProperty { get; set; } public string NoGenericProp { get; set; } } // 反射筛选逻辑 var openGenType = typeof(Gen<>); // 正确引用开放泛型类型 var genProps = typeof(Thing) .GetProperties(BindingFlags.Public | BindingFlags.Instance) .Where(pi => pi.PropertyType.IsGenericType && pi.PropertyType.GetGenericTypeDefinition() == openGenType); // 输出结果验证 foreach (var prop in genProps) { Console.WriteLine($"找到泛型属性:{prop.Name},类型:{prop.PropertyType.Name}"); }
关键逻辑解释
typeof(Gen<>):获取Gen<T>的开放泛型类型定义,这是引用未绑定类型参数的泛型类的正确方式。IsGenericType:确保属性的类型是一个已经绑定了具体类型的构造泛型(避免误判非泛型类型)。GetGenericTypeDefinition():获取构造泛型类型对应的开放泛型模板,比如Gen<int>的泛型定义就是Gen<>,这样就能和我们目标的开放泛型类型做相等判断。
额外补充:处理可空泛型类型
如果你的属性是可空的泛型(比如public Gen<int>? NullableGenInt { get; set; }),需要先获取它的底层非可空类型,再判断泛型定义:
.Where(pi => { var propType = pi.PropertyType; // 如果是可空类型,获取底层类型 if (Nullable.GetUnderlyingType(propType) != null) { propType = Nullable.GetUnderlyingType(propType); } return propType.IsGenericType && propType.GetGenericTypeDefinition() == openGenType; })
内容的提问来源于stack exchange,提问作者Bradley Uffner
相关产品推荐
相关产品推荐

