如何以编程方式将当前类作为泛型类型传入?
解决方案
首先,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
相关产品推荐
相关产品推荐

