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

如何通过反射获取类中基于开放泛型类型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:26