C# 如何简化泛型约束,同时兼容未实现自定义接口的第三方类?
简化C#泛型多约束写法的可行方案
注:你原代码中的
IDisposeable为拼写错误,官方BCL中的接口名为IDisposable,以下示例均使用正确拼写。
方案1:泛型类层级复用约束(兼容所有C#版本)
如果有多个方法使用相同的泛型约束,可以将约束提升到外层泛型类定义处,类内部的所有泛型方法无需重复声明约束:
// 约束仅需在类级别声明一次 public class GenericOperation<T> where T : IDisposable, ICloneable, IRunnable, IMyInterface1 { // 方法无需重复写约束 public void Do(T arg) { // 业务逻辑 } // 其他同约束的方法同样复用约束 public void AnotherOperation(T arg) { // 业务逻辑 } }
方案2:轻量适配器包装(兼容所有C#版本)
如果希望保留合并接口的简化写法,同时兼容第三方未实现该接口的类型,可以实现一个通用的轻量包装类,仅做接口成员转发,几乎无性能损耗:
首先保留你定义的合并接口:
public interface ICombinedInterface : IDisposable, ICloneable, IRunnable, IMyInterface1 {}
实现通用包装类:
public class CombinedInterfaceAdapter<T> : ICombinedInterface where T : IDisposable, ICloneable, IRunnable, IMyInterface1 { private readonly T _innerInstance; public CombinedInterfaceAdapter(T innerInstance) => _innerInstance = innerInstance; // 转发所有接口成员到内部实例 public void Dispose() => _innerInstance.Dispose(); public object Clone() => _innerInstance.Clone(); public void Run() => _innerInstance.Run(); // 按实际需求转发IMyInterface1的所有成员 public void MyInterfaceMethod() => _innerInstance.MyInterfaceMethod(); }
使用方式:
// 第三方类型ThirdPartyType满足所有约束但未实现ICombinedInterface var thirdPartyObj = new ThirdPartyType(); var adapter = new CombinedInterfaceAdapter<ThirdPartyType>(thirdPartyObj); Do(adapter);
方案3:泛型别名简化(C# 12及以上支持)
C# 12开始支持带参数的using别名,你可以在文件顶部或者全局using文件中定义约束的别名,后续所有同约束的位置都可以直接使用别名:
// 文件顶部定义 using CombinedConstraint<T> = where T : IDisposable, ICloneable, IRunnable, IMyInterface1; // 方法声明时直接使用别名 void Do<T>(T arg) where T : CombinedConstraint<T>;
内容的提问来源于stack exchange,提问作者Zach
相关产品推荐
相关产品推荐

