2010-09-21 2 views
2

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

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

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

Спасибо.

ответ

5

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

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

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

+0

Отличный вариант! Я всегда забываю об использовании динамического для этого. –

+0

Могу ли я сделать это с помощью деревьев выражений? (.NET 2.0 + DLR - это вариант для меня, но 4.0 нет) Я попытался исправить быстрый invoker, который в основном выполнял сравнение Expression.Convert (Expression.Parameter (typeof (single)), typeof (double)) по моему единственному значению, но это не удалось с актом недействительно во время выполнения (не время компиляции). Я мог бы сделать что-то не так, потому что я потратил всего около 5 минут, чтобы попытаться это сделать, а потом пришлось бежать на обед ... – Jeff

+0

@ JeffN825: Думаю, вам нужно будет выработать правильные конверсии для себя. Это будет не очень весело. –

1

Если C# 4 является опцией, Jon Skeet's suggestion of using dynamic, скорее всего, идеален.

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

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

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

+0

спасибо ... но как определить «более широкий» тип? – Jeff

+0

@ JeffN825: Вам нужно будет вручную проверить это - вот почему я предложил просто использовать десятичную (поскольку она всегда такая же широкая/широкая). –

+0

Как насчет случая, когда double имеет более высокое максимальное значение/меньшее значение min, чем десятичное? – Jeff

Смежные вопросы