Короче говоря, в C # у меня есть функция, которая имеет два «объекта» (да, класс!), Представляющих потенциально примитивный тип (исключая bool), и я хочу их протестировать. Вот код, чтобы лучше это объяснить:

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

Но, как вы знаете, это невозможно ... Есть способ сделать это?

2
Kamigaku 26 Фев 2016 в 02:04

2 ответа

Лучший ответ

Вы можете сделать это, приведя оба объекта к dynamic. Это заставит среду выполнения определять, как сравнивать два объекта, а не компилятор . Таким образом, функция сравнения может выполняться с любым объектом (включая примитивы), который перегружает операторы < и >.

public void Compare(object value1, object value2) {
    if ((dynamic)value1 < (dynamic)value2)
        // do something
    if ((dynamic)value1 > (dynamic)value2)
        // do something else...
}
3
Benjamin W. 25 Фев 2016 в 23:25

Вы можете сделать свой метод универсальным и добавить ограничение, разрешающее только типы 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);
}

Но в обоих случаях value1 и value2 должны быть одного типа.

3
Arturo Menchaca 25 Фев 2016 в 23:30