0

例如:

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。

4

3 回答 3

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 同步。

于 2014-04-03T14:36:46.703 回答
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# 不支持预处理器宏、隐式接口或约束别名,因此您需要复制粘贴约束。

于 2014-04-03T14:28:59.533 回答
0

没有 C# 语言机制可以做到这一点。您可能希望的最好结果是某些 3rd 方工具可能为您列出它们,但这当然不会随着对ClassA.

于 2014-04-03T14:28:34.000 回答