La mia domanda riguarda il controllo dei tipi in una catena di metodi generici. Diciamo che ho un metodo di estensione che tenta di convertire una matrice di byte in int, decimale, stringa o DateTime.Evitare un eccessivo controllo dei tipi nei metodi generici?
public static T Read<T>(this ByteContainer ba, int size, string format) where T : struct, IConvertible
{
var s = string.Concat(ba.Bytes.Select(b => b.ToString(format)).ToArray());
var magic = FromString<T>(s);
return (T)Convert.ChangeType(magic, typeof(T));
}
Questo chiama un metodo chiamato FromString che traduce la stringa concatenata in un tipo specifico. Purtroppo, la logica di business è completamente dipendente dal tipo T. Quindi io alla fine con un blocco if-else megalitica:
private static T FromString<T>(string s) where T : struct
{
if (typeof(T).Equals(typeof(decimal)))
{
var x = (decimal)System.Convert.ToInt32(s)/100;
return (T)Convert.ChangeType(x, typeof(T));
}
if (typeof(T).Equals(typeof(int)))
{
var x = System.Convert.ToInt32(s);
return (T)Convert.ChangeType(x, typeof(T));
}
if (typeof(T).Equals(typeof(DateTime)))
... etc ...
}
A questo punto, preferirei più metodi con lo stesso nome e diversi tipi di ritorno, qualcosa sulla falsariga di questo:
// <WishfulThinking>
private static decimal FromString<T>(string s)
{
return (decimal)System.Convert.ToInt32(s)/100;
}
private static int FromString<T>(string s)
{
return System.Convert.ToInt32(s);
}
// </WishfulThinking>
... ma mi rendo conto che questo non è valido, come T non possono essere costretti a un tipo specifico, e senza di essa, tutti i metodi avranno lo stesso in conflitto firma.
Esiste un modo fattibile per implementare FromString senza un controllo eccessivo dei caratteri? O potrebbe esserci un modo migliore per affrontare del tutto questo problema?
Questo mi sembra un problema, è possibile risolvi con le espressioni. – lukegravitt