120 votes

Couler l'objet dans T

J'analyse un fichier XML à l'aide de la fonction XmlReader en .NET et j'ai pensé qu'il serait judicieux d'écrire une fonction d'analyse générique pour lire les différents attributs de manière générique. J'en suis arrivé à la fonction suivante :

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAsObject();
    return (T)readData;
}

Comme je m'en suis rendu compte, cela ne fonctionne pas tout à fait comme je l'avais prévu ; il y a une erreur avec les types primitifs tels que int o double puisqu'un cast ne peut pas convertir un string à un type numérique. Existe-t-il un moyen de faire prévaloir ma fonction sous une forme modifiée ?

261voto

Bob Points 34449

Vérifiez d'abord s'il est possible de le couler.

if (readData is T) {
    return (T)readData;
} 
try {
   return (T)Convert.ChangeType(readData, typeof(T));
} 
catch (InvalidCastException) {
   return default(T);
}

20voto

Lasse V. Karlsen Points 148037

Avez-vous essayé Convert.ChangeType ?

Si la méthode renvoie toujours une chaîne de caractères, ce que je trouve étrange, mais ce n'est pas le sujet, alors peut-être que ce code modifié ferait ce que vous voulez :

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAsObject();
    return (T)Convert.ChangeType(readData, typeof(T));
}

15voto

Adinochestva Points 4459

Essayer

if (readData is T)
    return (T)(object)readData;

3voto

Tom Ritter Points 44352

Vous pourriez exiger que le type soit un type de référence :

 private static T ReadData<T>(XmlReader reader, string value) where T : class
 {
     reader.MoveToAttribute(value);
     object readData = reader.ReadContentAsObject();
     return (T)readData;
 }

Et puis en faire un autre qui utilise les types de valeurs et TryParse...

 private static T ReadDataV<T>(XmlReader reader, string value) where T : struct
 {
     reader.MoveToAttribute(value);
     object readData = reader.ReadContentAsObject();
     int outInt;
     if(int.TryParse(readData, out outInt))
        return outInt
     //...
 }

3voto

baretta Points 4391

A

H

T

private static T ReadData<T>(XmlReader reader, string value)
{
    reader.MoveToAttribute(value);
    object readData = reader.ReadContentAs(typeof(T), null);
    return (T)readData;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X