Operatore di confronto utilizzando la riflessione
-
04-10-2019 - |
Domanda
voglio mettere a confronto due valori in fase di esecuzione utilizzando la riflessione. Stavo usando Comparer.Default.Compare (x, y) per questo, ma sono reso conto che questo non è sufficiente. Diciamo che voglio mettere a confronto un doppio a un singolo (1,0 == 10). Comparer.Default un'eccezione perché insiste che entrambi i valori devono essere dello stesso tipo (doppio). Tuttavia, esiste una conversione esplicita per questo, che è davvero quello che voglio utilizzare.
Quindi, perché non posso semplicemente usare Convert.ChangeType? Prendiamo il caso di 1,25> 1 (doppia> intero). Se provo Convert.ChangeType (1,25, typeof (int)) il 1,25, mi metterò 1, e l'affermazione di cui sopra mancherò, quando in realtà 1,25 è> 1.
Quindi, Qualcuno può suggerire un modo di invocare il confronto esplicito (se esiste) che un tipo definisce?
Grazie.
Soluzione
Stai usando C # e .NET 4 4? Se è così, è davvero facile con tipizzazione dinamica:
dynamic x = firstValue;
dynamic y = secondValue;
if (x > y) // Or whatever
I esegue compilatore tutte le conversioni appropriate per voi.
Altri suggerimenti
Se C # 4 è un'opzione, il suggerimento di Jon Skeet di utilizzare dinamica è più probabile che l'ideale.
Se non lo è, quindi ...
Non è un confronto esplicito. Il compilatore, al momento della compilazione, esegue la conversione, poi invoca il paragone appropriato.
La cosa migliore è quella di utilizzare Convert.ChangeType per convertire al tipo più ampio, e poi fare il confronto sul risultato. Se non si desidera gestire il controllo di tutti i tipi, in genere è possibile convertire entrambi i lati per i valori decimal
, quindi utilizzare un singolo confronto per controllare loro, come decimal
dovrebbe gestire tutti i tuoi valori in modo adeguato.