0

我想对下面的泛型类型进行限制,但我不确定是否可以按照我的意图进行操作。

public interface IMyClass<in TA, in TB>
{
    bool MyMethod<TX, TY>(TX argumentX, TY argumentY);
}

public class MyClass<TA, TB> : IMyClass<TA, TB>
{
    public bool MyMethod<TX, TY>(TX argumentX, IEnumerable<TY> argumentsY)
    {
        // DO STUFF
    }
}

TX 和 TY 类型是为了代表 TA 和 TB,但需要是可互换的(这就是为什么我不能在方法中使用 TA 和 TB 而不复制代码)。这就是约束需要发挥作用的方式:

  • TX 必须与 TA 或 TB 类型相同。
  • TY 必须与 TA 或 TB 类型相同。
  • 如果 TX 与 TA 类型相同,则 TY 必须与 TB(和 vv)类型相同。

有没有办法在设计时使用通用约束来强制执行这一点,或者我必须使用异常来实现它以在运行时失败?

4

2 回答 2

0

简而言之,不,通用约束是附加的,不能基于布尔逻辑打开或关闭。非常值得怀疑的是,在这些类型的约束下,您一般能够做什么。

于 2013-09-28T03:38:32.800 回答
0

不是直接的,但是你可以用两个重载的方法来解决这个问题。

public class MyClass<TA, TB> : IMyClass<TA, TB>
{
    public bool MyMethod(TA argumentX, TB argumentY)
    {
        string argX = SpecialPreFormatterForTA(argumentX);
        string argY = SpecialPreFormatterForTB(argumentY);
        return MyMethodCommon(argX, argY);
    }

    public bool MyMethod(TB argumentX, TA argumentY)
    {
        string argX = SpecialPreFormatterForTB(argumentX);
        string argY = SpecialPreFormatterForTA(argumentY);
        return MyMethodCommon(argX, argY);
    }

    private bool MyMethodCommon(string argX, string argY)
    {
        // DO STUFF
    }
}

我对您使用代码所做的事情进行了一些修改和一些假设,以帮助证明这一点。您可以在每个重载方法中执行您需要执行的任何特定格式,然后调用,然后您可以让两个函数调用第三个函数,该函数不关心两个原始参数的类型,以减少代码重用。

于 2013-09-28T04:02:36.767 回答