Оператор сравнения с использованием Reflection - PullRequest
2 голосов
/ 21 сентября 2010

Я хочу сравнить два значения во время выполнения, используя отражение. Я использовал Comparer.Default.Compare (x, y) для этого, но я осознал, что этого недостаточно. Допустим, я хочу сравнить двойной с одним (1,0 == 10). Comparer.Default вызовет исключение, потому что он настаивает на том, что оба значения должны быть одного типа (double). Однако для этого существует явное преобразование, которое я и хочу использовать.

Итак, почему я не могу просто использовать Convert.ChangeType? Возьмите случай 1,25> 1 (двойное> целое число). Если я попробую Convert.ChangeType (1.25, typeof (int)) на 1.25, я получу 1, и приведенное выше утверждение потерпит неудачу, когда действительно 1.25 IS> 1.

Итак, кто-то может предложить способ вызова явного сравнения (если оно существует), которое определяет тип?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 21 сентября 2010

Вы используете C # 4 и .NET 4?Если это так, то с помощью динамической типизации это действительно просто:

dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever

Компилятор выполняет все необходимые преобразования для вас.

1 голос
/ 21 сентября 2010

Если C # 4 является опцией, Предложение Джона Скита об использовании динамического , скорее всего, идеально.

Если это не так, тогда ...

НетЯвное сравнение.Компилятор во время компиляции выполняет преобразование, а затем вызывает соответствующее сравнение.

Лучше всего использовать Convert.ChangeType для преобразования в более широкий тип, а затем выполнить сравнение по результату.Если вы не хотите обрабатывать проверку всех типов, вы можете конвертировать обе стороны в значения decimal, а затем использовать одно сравнение для проверки их, поскольку decimal должен адекватно обрабатывать все ваши значения.

...