可以将泛型类型参数约束到另一个泛型类型参数接受的内容吗?

时间:2014-04-03 14:22:35

标签: c# generics generic-constraints

例如:

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。

3 个答案:

答案 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的任何更改保持最新状态。