例如:
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。
答案 0 :(得分:2)
如果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同步。
答案 1 :(得分:1)
如果我控制了类型定义,那么我会使用一个通用接口。
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#不支持预处理器宏,隐式接口或约束别名,因此您需要复制粘贴约束。
答案 2 :(得分:0)
没有C#语言机制可以做到这一点。您可能希望的最好的是,某些第三方工具可能可能为您列出它们,但当然不会对ClassA
的任何更改保持最新状态。