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

如何以编程方式将当前类作为泛型类型传入?

解决方案

首先,C#中无法直接在编译时将typeof(this)作为泛型方法的类型参数传入——因为泛型参数要求是编译时确定的类型,而typeof(this)是运行时才能获取的Type对象。不过有两种可行的实现方式:

1. 通过反射调用泛型方法

利用反射动态创建泛型版本的DoStuff方法并调用,自动获取当前类的类型:

public class foo
{
    public foo()
    {
        // 获取DoStuff方法的泛型定义
        var method = typeof(ContentManager).GetMethod("DoStuff");
        // 传入当前实例的类型,构造泛型方法
        var genericMethod = method.MakeGenericMethod(GetType());
        // 调用方法(静态方法传null;实例方法传ContentManager对象)
        genericMethod.Invoke(null, null);
    }
}

注意事项:

  • 如果DoStuff存在重载,需要用GetMethod的重载版本指定参数类型,避免匹配错误。
  • 反射会带来一定性能开销,若这段代码被频繁调用,需权衡性能影响。

2. 使用泛型基类

如果你的类可以继承泛型基类,可将泛型调用逻辑放在基类中,子类只需继承时指定自身类型:

// 泛型基类
public abstract class BaseClass<T> where T : BaseClass<T>
{
    protected BaseClass()
    {
        ContentManager.DoStuff<T>();
    }
}

// 子类继承时指定自身作为类型参数
public class foo : BaseClass<foo>
{
    // 子类构造函数无需重复编写DoStuff调用逻辑
}

这种方式是编译时确定类型,没有反射的性能开销,但需要子类遵循继承约定(将自身作为泛型参数传入基类)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 11:16:55