我认为我的代码可以自我解释我想要实现的目标:
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的方法。 注意:排除将为&gt;传递字符串的条件或者&lt;检查OR Int将被发送给&#34;包含&#34;检查
答案 0 :(得分:9)
您可以使用Comparer<T>.Default.Compare(operatorOne, operatorTwo)
进行比较。请注意,如果T
未实现IComparable
和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;
}
}
<强> P.S。强>
建议 Servy ,您也可以将IComparer
作为额外参数传递给该函数。它将允许涵盖既不实现IComparable
也不IComparable<T>
的类型,因此Comparer<T>.Default
对它们不起作用。
此外,积分会转到 @TimothyShields ,他建议Comparer<T>.Default
。