C#基类方法如何优雅引用继承类成员,无需手动传参或额外实现
解决方案:使用泛型抽象基类(奇异递归模板模式CRTP)
你可以通过将继承类类型作为泛型参数传递给基类的方式实现需求,完全避开你提到的三种不想要的实现方式,代码如下:
using System; namespace Test { // 泛型抽象基类,约束类型参数必须继承自当前基类 public abstract class BaseClass<T> where T : BaseClass<T> { // 公共方法直接通过强转this获取子类实例,无需额外传参 public void ReferenceInheriting() { T inheritingInstance = (T)this; // 可直接访问子类的公共字段、属性,也可通过反射访问非公共成员 Console.WriteLine("Do things specific to the inheriting class or instance thereof: " + inheritingInstance.GetType().Name); } } // 子类继承时仅需指定自身为泛型参数即可,无需编写任何转接逻辑 public class Inheriting : BaseClass<Inheriting> { // 可以给子类加自定义的属性、字段供基类访问 public string CustomProp { get; set; } = "Test value"; } class Program { public static void Main(string[] args) { Inheriting inh = new Inheriting(); // 直接调用基类方法即可,无需传参 inh.ReferenceInheriting(); } } }
方案优势
- 完全不需要在调用基类方法时手动传入子类实例引用
- 子类不需要单独实现任何转接方法,仅需在继承时指定泛型参数即可
- 不需要编写额外的扩展方法
- 如果需要基类固定访问子类的特定成员,可以给泛型参数加上接口约束,基类中就能直接访问对应成员,无需反射处理。
内容的提问来源于stack exchange,提问作者Ben Philipp。
相关产品推荐
相关产品推荐

