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 ?

2voto

Ricardo Villamil Points 3080

Ajoutez une contrainte de "classe" (ou plus détaillée, comme une classe de base ou une interface de vos objets T attendus) :

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

o where T : IMyInterface o where T : new() , etc.

2voto

ChrisW Points 37322

Vous pouvez vraisemblablement passer en paramètre un délégué qui convertira la chaîne de caractères en T.

1voto

genki Points 226

En fait, les réponses soulèvent une question intéressante, à savoir ce que vous voulez que votre fonction fasse en cas d'erreur.

Peut-être serait-il plus logique de le construire sous la forme d'une méthode TryParse qui tente de lire dans T, mais renvoie un faux si cela ne peut être fait ?

    private static bool ReadData<T>(XmlReader reader, string value, out T data)
    {
        bool result = false;
        try
        {
            reader.MoveToAttribute(value);
            object readData = reader.ReadContentAsObject();
            data = readData as T;
            if (data == null)
            {
                // see if we can convert to the requested type
                data = (T)Convert.ChangeType(readData, typeof(T));
            }
            result = (data != null);
        }
        catch (InvalidCastException) { }
        catch (Exception ex)
        {
            // add in any other exception handling here, invalid xml or whatnot
        }
        // make sure data is set to a default value
        data = (result) ? data : default(T);
        return result;
    }

edit : maintenant que j'y pense, ai-je vraiment besoin de faire le test convert.changetype ? la ligne as n'essaie-t-elle pas déjà de le faire ? Je ne suis pas sûr que faire ce test supplémentaire de c

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