2016-02-25 56 views
2

长话短说,我在C#中拥有两个表示潜在原始类型(不包括布尔)的“对象”(是类!来测试它们。 下面是一个代码来解释它更好地:用运算符<,<=等测试两个对象

public void Compare(object value1, object value2) { 
    if(value1 < value2) 
     //do something 
    if(value1 > value2) 
     // do something else... 
} 

但正如你可能知道这是不可能的......有没有办法做到这一点?

+0

重载'>'和'<'运算符。 –

+0

你可以尝试转换到IComparable –

+0

@TravisJ:如果我超载他们,我仍然需要为每种类型进行测试。 GlorinOakenfoot:我曾尝试过: IComparable comp = value as IComparable; IComparable comp2 = this._response as IComparable; if(comp> comp2){} 但它给了我错误:操作符'>'不能应用于类型为IComparable和IComparable的操作数 – Kamigaku

回答

3

您可以通过将两个对象都投射到dynamic来完成此操作。这将导致运行时间确定如何比较两个对象而不是编译器。通过这种方式,比较函数可以用任何对象(包括基元)执行,这些对象会使运算符过载。

public void Compare(object value1, object value2) { 
    if ((dynamic)value1 < (dynamic)value2) 
     // do something 
    if ((dynamic)value1 > (dynamic)value2) 
     // do something else... 
} 
+0

该死,简短而且很好的答案!感谢您的提示! – Kamigaku

3

你可以让你的方法仿制并添加约束只允许IComparable<>类型:

public void Compare<T>(T value1, T value2) where T : IComparable<T> 
{ 
    if (value1.CompareTo(value2) < 0) 
    //do something 
    if (value1.CompareTo(value2) > 0) 
    // do something else... 
} 

或者你可以使用Comparer.Default.Compare()方法,适用于数字类型:

public static void Compare(object value1, object value2) 
{ 
    if (Comparer.Default.Compare(value1, value2) < 0) 
     Console.WriteLine(1); 

    if (Comparer.Default.Compare(value1, value2) > 0) 
     Console.WriteLine(0); 
} 

但在两种情况下,value1value2必须是相同类型

+1

我想知道如果value1和value2总是相同的类型 – CRice

+0

@他们是!即使没有,一个简单的value1.getType == value.getType将会解决这个问题。 – Kamigaku

+0

@ArturoMenchaca:这是一个很好的解决方案,感谢您的帮助。 – Kamigaku