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

如何在C#中通过泛型从继承类自动推导类型参数?

简化泛型方法调用:自动推导泛型参数

问题背景

定义的接口:

public interface IFeature<T>
{
    public T Value { get; set; }
}

实现该接口的类:

public class SharepointFeature : IFeature<string>
{
    public string Value { get; set; }
}

当前的泛型方法定义:

public T GetFeature<T, TValue>() where T : IFeature<TValue>
{
    // 业务逻辑
}

当前调用需要指定两个泛型参数:

public void Test()
{
    // 可正常运行的写法
    var feature = GetFeature<SharepointFeature, string>();
    // 期望的简化写法,仅指定一个泛型参数
    // var feature = GetFeature<SharepointFeature>();
}

需要修改GetFeature方法,使其能从指定的T自动推导TValue的类型,实现简化调用。

解决方案

可以通过反射在方法内部自动解析T所实现的IFeature<>接口的泛型参数,从而避免手动指定TValue。修改后的方法如下:

public T GetFeature<T>()
{
    // 查找T实现的IFeature<>泛型接口
    var featureInterface = typeof(T).GetInterfaces()
        .FirstOrDefault(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IFeature<>));

    if (featureInterface == null)
    {
        throw new InvalidOperationException($"类型 {typeof(T).Name} 未实现 IFeature<> 接口");
    }

    // 获取IFeature<>的泛型参数TValue
    Type tValueType = featureInterface.GetGenericArguments()[0];

    // 这里执行你的原有业务逻辑,比如根据tValueType处理数据、创建实例等
    // 示例:创建T的实例(如果T有无参构造函数,可根据实际调整)
    return Activator.CreateInstance<T>();
}

调用方式

现在可以直接使用期望的简化写法,无需指定TValue:

public void Test()
{
    var feature = GetFeature<SharepointFeature>();
    // feature的类型为SharepointFeature,其Value属性为string类型
}

额外说明

  • 该方法在运行时通过反射解析泛型参数,保证了调用的简洁性;
  • 如果需要编译时的类型安全,可以考虑调整接口或方法的设计,比如将GetFeature的返回类型改为IFeature<TValue>,但这种方式需要调用时指定TValue,无法完全满足仅指定T的需求;
  • 如果T可能实现多个泛型接口,需要确保逻辑正确过滤出IFeature<>接口。

内容的提问来源于stack exchange,提问作者Morasiu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:16:13