Operador de comparación que utilizan la reflexión
-
04-10-2019 - |
Pregunta
Quiero comparar dos valores en tiempo de ejecución utilizando la reflexión. Yo estaba usando Comparer.Default.Compare (x, y) para esto, pero me he dado cuenta de que esto no es suficiente. Digamos que quiero comparar un doble con una sola (1,0 == 10). Comparer.Default arrojará una excepción, ya que insiste en que ambos valores deben ser del mismo tipo (doble). Sin embargo, existe una conversión explícita para esto, que es realmente lo que desea utilizar.
Así que, ¿por qué no puedo usar Convert.ChangeType? Tomemos el caso de 1.25> 1 (doble> entero). Si intento Convert.ChangeType (1,25, typeof (int)) en 1.25, voy a tener 1, y la afirmación anterior a fallar, cuando en realidad 1.25 es> 1.
Así que, por favor alguien puede sugerir una manera de invocar la comparación explícita (si existe) que define un tipo?
Gracias.
Solución
¿Está utilizando C # .NET 4 y 4? Si es así, es muy fácil usando tipado dinámico:
dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever
El compilador realiza todas las conversiones apropiadas para usted.
Otros consejos
Si C # 4 es una opción, la sugerencia de utilizar dinámica de Jon Skeet es más probable ideal.
Si no es así, entonces ...
No es una comparación explícita. El compilador, en tiempo de compilación, hace la conversión, a continuación, invoca la comparación apropiada.
Su mejor opción es utilizar Convert.ChangeType para convertir al tipo más amplio, y luego hacer la comparación del resultado. Si no desea manejar la comprobación de todos los tipos, puede convertir normalmente a ambos lados valores decimal
, a continuación, utilizar una única comparación para comprobar ellos, como decimal
debe manejar todas sus valores de forma adecuada.