C#编写子类扩展方法时如何复用基类扩展方法避免重复代码
问题描述
存在基类A、继承自A的子类B,已为A实现了转ADto的扩展方法,但该方法未覆盖B的独有属性,需要为B编写对应扩展方法时复用已有逻辑,消除重复代码。原有代码定义如下:
public class A { public int Id { get; set; } public string FirstName {get; set; } public string LastName { get; set; } } public class B: A { public int Age { get; set; } } internal static class ClassAExtension { public static ADto ExtensionA(this A a) { return a != null ? new ADto { Id = a.Id, Name = a.FirstName + " " + a.LastName } : null; } } public class ADto { public int Id { get; set; } public string Name { get; set; } public int Age { get; set;} }
实现方法
扩展方法本质是静态类中的静态方法,不存在多态绑定特性,因此可以直接在子类的扩展方法中显式调用基类的扩展静态方法复用已有逻辑,步骤如下:
- 为子类
B新增同名扩展方法,保持方法名和返回值一致,C#会根据调用方的类型自动匹配最合适的重载 - 方法内先做判空处理,之后直接通过基类扩展的静态类名,显式调用基类扩展方法,传入当前
B的实例,拿到已经映射完基类属性的ADto对象 - 补充赋值
B独有的属性后返回即可
具体实现代码:
internal static class ClassBExtension { public static ADto ExtensionA(this B b) { if (b == null) return null; // 显式调用A的扩展方法,复用基类属性映射逻辑 ADto dto = ClassAExtension.ExtensionA(b); // 补充处理子类独有属性 dto.Age = b.Age; return dto; } }
注意事项
不要在B的扩展方法内部用b.ExtensionA()的形式调用,否则编译器会优先匹配针对B的扩展重载,触发无限递归导致栈溢出,必须通过静态类名显式调用基类对应的扩展方法。
这种写法下,后续如果基类A的映射规则调整(比如Name拼接逻辑修改),只需要修改A的扩展方法一处代码,B的扩展逻辑会自动同步,不会出现多份重复代码逻辑不一致的问题。
内容的提问来源于stack exchange,提问作者Chatra
相关产品推荐
相关产品推荐

