0

我正在编写一个函数来比较 IComparable 类型的 2 个值,如果不相等则抛出。基本上,重新制作断言。是的,我知道我正在重新发明轮子。

    public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T>
    {
        if (0 != Value1.CompareTo(Value2))
        {
            throw new ApplicationException("Fail");
        }
    }

工作正常,除了字符串,我希望忽略大小写的选项。“AA”与“AA”

我想在 T 是字符串时专门重写此方法,因此我可以使用 String.Compare 并忽略大小写。拥有另一个参数也很酷,因此用户可以指定是否应忽略字符串(尽管,这对于其他类型(如 int)没有用,因此看起来有点像一个令人困惑/糟糕的设计。我愿意接受这里的建议)。

有没有好的方法来做到这一点?我也愿意更改为与 IComparable 不同的类型,最初认为这是该工作的最佳界面,但现在意识到我可能错了。

where T : IComparable<T>
4

2 回答 2

2

您可以创建另一个函数,专门用于字符串。

public static void IsEqual(string value1, string value2) 
{
  if (string.Compare(value1, value2, true) != 0)
    throw new ApplicationException("Fail for strings");
}

然后如果你要调用IsEqual(1, 1)你的泛型重载将被调用,但如果你调用IsEqual("A", "a")字符串重载将被调用。然后,如果需要,您可以简单地为字符串重载添加另一个可选参数。

于 2012-05-22T19:25:01.247 回答
1

你可以试试:

public static void IsEqual<T>(T Value1, T Value2) where T : IComparable<T>
    {
        if (typeof(T) == typeof(String))
        {
            if (String.Compare(Value1.ToString(), Value2.ToString(), true) != 0)
            {
                throw new ApplicationException("Fail");
            }
        }
        else if (0 != Value1.CompareTo(Value2))
        {
            throw new ApplicationException("Fail");
        }
    }
于 2012-05-22T19:26:59.823 回答