0

我认为我的代码对于我想要实现的目标是不言自明的:

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    {
        switch (operand.ToLower())
        {
            case "=":
                return operatorOne.Equals(operatorTwo);
            case "<":
                return operatorOne < operatorTwo;
            case ">":
                return operatorOne > operatorTwo;
            case "contains":
                return operatorOne.ToString().Contains(operatorTwo.ToString());
            default:
                return false;
        }
    }

它给了我错误:

Error   16  Operator '>','<' cannot be applied to operands of type 'T' and 'T'

我需要一种可以比较字符串、Int、Double、chars 的方法。注意:排除字符串将被传递为>或<检查或Int将被发送用于“包含”检查的条件

4

1 回答 1

11

您可以Comparer<T>.Default.Compare(operatorOne, operatorTwo)用于比较。请注意,如果T不实现IComparableand IComparable<T>Comparer<T>.Default.Compare则会引发异常。

为确保T实现IComparable,您可以添加where T: IComparable约束。(它将排除实现的类IComparable<T>但不 IComparable排除。仍然可以接受,因为许多实现IComparable<T>的类也实现IComparable了。)

private bool Comparison<T>(T operatorOne, T operatorTwo, string operand)
    where T: IComparable
{
    switch(operand.ToLower())
    {
        case "=":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) == 0;
        case "<":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) < 0;
        case ">":
            return Comparer<T>.Default.Compare(operatorOne, operatorTwo) > 0;
        case "contains":
            return operatorOne.ToString().Contains(operatorTwo.ToString());
        default:
            return false;
    }
}

附言

正如Servy 所建议的,您也可以将IComparer作为额外参数传递给函数。它将允许覆盖既不实现IComparable也不实现的类型IComparable<T>,因此Comparer<T>.Default对它们不起作用。

此外,感谢 @TimothyShields提出的建议Comparer<T>.Default

于 2014-08-22T14:29:58.833 回答