例如:
class ClassA<TA> where TA: T1, T2, T3, T4 ...
{
}
class ClassB<TB> where TB: whatever ClassA.TA accepts
{
ClassA<TB> MyA;
}
由于 SSoT 和 DRY 原则,我不想将 ClassA 的约束复制到 ClassB。
例如:
class ClassA<TA> where TA: T1, T2, T3, T4 ...
{
}
class ClassB<TB> where TB: whatever ClassA.TA accepts
{
ClassA<TB> MyA;
}
由于 SSoT 和 DRY 原则,我不想将 ClassA 的约束复制到 ClassB。
如果 ClassB 是 ClassA 的公共内部类是可以接受的,那么您可以这样做。这是相当不雅和丑陋的。
public class ClassA<T> where T : IDisposable
{
public ClassA(T thing)
{
ThingA = thing;
}
public T ThingA { get; set; }
public class ClassB
{
public ClassB(T thing)
{
ThingB = thing;
}
public T ThingB { get; set; }
}
}
这让我可以使用这种(可怕的)语法:
var b = new ClassA<Stream>.ClassB(stm);
我认为您最好的选择是编写两个明显的单元测试,用于Type.GetGenericParameterConstraints
确保 ClassA 和 ClassB 同步。
如果我可以控制类型定义,那么我将使用通用接口。
public interface IBase { }
public class T1 : IBase { }
public class T2 : IBase { }
public class ClassA<TA> where TA: IBase { }
public class ClassB<TB> where TB: IBase { }
否则 C# 不支持预处理器宏、隐式接口或约束别名,因此您需要复制粘贴约束。
没有 C# 语言机制可以做到这一点。您可能希望的最好结果是某些 3rd 方工具可能会为您列出它们,但这当然不会随着对ClassA
.