Оператор сравнения с использованием отражения
-
04-10-2019 - |
Вопрос
Я хочу сравнить два значения во время выполнения с использованием отражения. Я использовал Comparer.default.compare (x, y) для этого, но я пришел, чтобы понять, что это не адекватно. Допустим, я хочу сравнить двойной до одного (1,0 == 10). Comparer.Default будет выбрасывать исключение, потому что он настаивает на том, что оба значения должны быть одинаковым типом (двойным). Однако для этого существует явное преобразование, что действительно то, что я хочу использовать.
Итак, почему я не могу просто использовать Convert.Changetype? Возьмите случай 1,25> 1 (двойное> целое число). Если я попробую Convert.Changetype (1.25, typeof (int)) на 1.25, я получу 1, и вышеупомянутое утверждение не удастся, когда действительно 1.25 -> 1.
Итак, может кто-то, пожалуйста, предложите способ вызовов явного сравнения (если он существует), что тип определяет?
Спасибо.
Решение
Вы используете C # 4 и .NET 4? Если это так, это действительно легко, используя динамические набравки:
dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever
Компилятор выполняет все соответствующие преобразования для вас.
Другие советы
Если C # 4 является вариантом, Предложение Jon Skeet об использовании динамического скорее всего идеал.
Если это не так, то ...
Там нет явного сравнения. Компилятор, в компиляционном времени, делает преобразование, затем вызывает соответствующее сравнение.
Ваша лучшая ставка - использовать Convertry.Changetype для преобразования в более широкий тип, а затем выполнить сравнение в результате. Если вы не хотите обрабатывать проверку всех типов, вы обычно можете преобразовать обе стороны в decimal
ценности, затем используйте одно сравнение, чтобы проверить их, как decimal
должен обрабатывать все ваши значения адекватно.