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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top