我是否可以在只需要强制执行的泛型类型上放置多个可选约束?

时间:2013-09-28 03:17:58

标签: c# generics constraints

我想对下面的泛型类型设置约束,但我不确定是否可以按照我想要的方式进行。

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(和v.v。)的类型相同。

有没有办法在设计时使用通用约束来强制执行此操作,还是必须使用异常在运行时实现它?

2 个答案:

答案 0 :(得分:0)

简而言之,不,通用约束是附加的,不能基于布尔逻辑打开或关闭。非常值得怀疑的是,你能够做出哪些一般也适合这些类型的约束。

答案 1 :(得分: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
    }
}

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