C#中如何用泛型函数统一多接口参数的重复逻辑?
可行的实现方案
以下是几种无需修改原有接口、也无需访问接口对应类的解决方法:
方法1:使用动态类型(dynamic)
利用C#的动态类型跳过编译期类型检查,直接在运行时解析方法调用:
void Function<T>(NotMyClass param1, T param2) { dynamic dynParam = param2; dynParam.Dostuff(param1); }
注意:这种方式会丢失编译期错误校验,如果传入的T类型没有匹配签名的Dostuff方法,错误会在运行时才抛出。
方法2:反射调用方法
通过反射获取并调用目标方法,同时可以添加校验逻辑确保类型合规:
void Function<T>(NotMyClass param1, T param2) { var method = typeof(T).GetMethod("Dostuff", new[] { typeof(NotMyClass) }); if (method == null) { throw new InvalidOperationException($"类型 {typeof(T).Name} 不存在签名为 Dostuff(NotMyClass) 的方法"); } method.Invoke(param2, new object[] { param1 }); }
这种方式比动态类型更可控,但性能略低,适合需要提前校验类型合法性的场景。
方法3:适配接口+包装类(编译期类型安全)
如果需要恢复编译期类型检查,可以自定义适配接口,为原有接口编写包装类:
- 定义自己的适配接口:
public interface ICanProcessNotMyClass { void DoStuff(NotMyClass param); }
- 为每个原有接口实现包装类:
public class Interface1Wrapper : ICanProcessNotMyClass { private readonly INotMyInterface1 _inner; public Interface1Wrapper(INotMyInterface1 inner) { _inner = inner; } public void DoStuff(NotMyClass param) { _inner.Dostuff(param); } } public class Interface2Wrapper : ICanProcessNotMyClass { private readonly INotMyInterface2 _inner; public Interface2Wrapper(INotMyInterface2 inner) { _inner = inner; } public void DoStuff(NotMyClass param) { _inner.Dostuff(param); } }
- 编写统一的调用函数:
void Function(NotMyClass param1, ICanProcessNotMyClass param2) { param2.DoStuff(param1); }
调用时只需将原有接口实例包装后传入:
INotMyInterface1 instance1 = GetInterface1Instance(); Function(myParam1, new Interface1Wrapper(instance1)); INotMyInterface2 instance2 = GetInterface2Instance(); Function(myParam1, new Interface2Wrapper(instance2));
这种方式完全保留编译期类型安全,但需要额外编写少量包装代码,适合对类型严谨性要求高的场景。
内容的提问来源于stack exchange,提问作者user1143689
相关产品推荐
相关产品推荐

