我正在编写一个函数来比较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”vs“aa”
当T是String时,我想特别重写此方法,所以我可以使用String.Compare并忽略大小写。拥有另一个参数也很酷,因此用户可以指定是否应该忽略字符串(但是,这对于像int这样的其他类型来说是无用的,所以看起来有点像混乱/糟糕的设计。我愿意接受这里的建议)。
这样做有好办法吗?我也愿意改变到与IComparable不同的类型,最初认为这是工作的最佳界面,但现在意识到我可能错了。
where T : IComparable<T>
答案 0 :(得分: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")
,则会调用字符串重载。然后,如果需要,您可以简单地为字符串重载添加另一个可选参数。
答案 1 :(得分: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");
}
}