Question

Je veux comparer deux valeurs lors de l'exécution en utilisant la réflexion. J'utilisais Comparer.Default.Compare (x, y) pour cela, mais je suis venu à réaliser que cela ne suffit pas. Disons que je veux comparer un double à un seul (1,0 == 10). Comparer.Default lancera une exception car elle insiste sur le fait que les deux valeurs doivent être du même type (double). Cependant, une conversion explicite existe pour ce qui est vraiment ce que je veux utiliser.

Alors, pourquoi ne puis-je simplement utiliser Convert.ChangeType? Prenons le cas de 1,25> 1 (double> entier). Si je tente Convert.ChangeType (1,25, typeof (int)) 1,25, je vais obtenir 1, et l'affirmation ci-dessus va échouer, alors qu'en réalité 1,25> 1.

Alors, quelqu'un peut-il s'il vous plaît suggérer un moyen d'invoquer la comparaison explicite (si elle existe) qu'un type définit?

Merci.

Était-ce utile?

La solution

Utilisez-vous C # 4 et .NET 4? Si oui, il est vraiment facile en utilisant le typage dynamique:

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

Le compilateur effectue toutes les conversions appropriées pour vous.

Autres conseils

Si C # 4 est une option, la suggestion de Jon Skeet d'utiliser dynamique est idéal le plus probable.

Si ce n'est pas, alors ...

Il n'y a pas une comparaison explicite. Le compilateur, au moment de la compilation, effectue la conversion, invoque alors la comparaison appropriée.

Votre meilleur pari est d'utiliser Convert.ChangeType pour convertir au type plus large, puis faire la comparaison sur le résultat. Si vous ne voulez pas gérer la vérification de tous les types, vous pouvez généralement convertir les deux côtés à des valeurs decimal, utilisez une seule comparaison pour les vérifier, comme decimal doit gérer de manière adéquate toutes vos valeurs.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top