C#如何编写通用泛型方法统一处理多类相同结构逻辑
方案1:定义公共接口(推荐,类型安全无性能损耗)
如果可以修改class1/class2/class3的源码,优先用接口做行为约束,完全避免重复逻辑:
- 首先定义公共接口,统一两个方法的约定:
public interface IDataProcessor { // Id的类型可根据实际业务调整,比如改为long、Guid等 string GetMainData(int id); string GetValue(string data, IDataProcessor processor); }
- 让三个目标类都实现该接口,原有方法的内部逻辑不需要修改,只要增加接口继承声明即可:
public class Class1 : IDataProcessor { // 原有GetMainData、GetValue的实现保持不变 } // Class2、Class3同理继承IDataProcessor即可
- 编写通用处理方法,用泛型约束适配所有实现了接口的类:
// 泛型约束new()表示支持无参数构造,可直接在方法内创建实例 public string GetProcessedValue<T>(int id) where T : IDataProcessor, new() { T processor = new T(); var data = processor.GetMainData(id); return processor.GetValue(data, processor); }
调用方式非常简洁,直接传入对应类作为泛型参数即可:
// 等效原Method1的执行结果 var result1 = GetProcessedValue<Class1>(Id); // 等效原Method2的执行结果 var result2 = GetProcessedValue<Class2>(Id); // 等效原Method3的执行结果 var result3 = GetProcessedValue<Class3>(Id);
方案2:无法修改原有类定义的情况(动态实现)
如果不能修改class1/class2/class3的源码、无法加接口继承,可以用dynamic做动态调用实现通用逻辑:
public string GetProcessedValue<T>(int id) where T : new() { dynamic processor = new T(); var data = processor.GetMainData(id); return processor.GetValue(data, processor); }
注意:该方案没有编译时类型校验,如果传入的类不存在对应签名的方法会运行时报错,仅适合确定所有传入类都符合方法约定的场景。
内容的提问来源于stack exchange,提问作者ANR
相关产品推荐
相关产品推荐

