Vous pouvez mettre en œuvre une méthode statique pour essayer de désérialiser chaque type possible. De cette façon, vous n'aurez pas à casser votre modèle d'objet pour prendre en charge la découverte de type à l'exécution.
Vous devriez toujours avoir quelques suppositions pour les types stockés dans le fichier XML. La sérialisation du fichier XML simle ne stocke pas les informations de type détaillées par défaut. Il semble qu'il devrait y avoir un attribut qui oblige le sérialiseur à stocker le nom de type détaillé, mais je ne l'ai pas trouvé ...
public static bool TryDeserialize<T>(XmlReader reader, out T obj) where T : class
{
// Return null, if we can't deserialize
obj = null;
XmlSerializer deserializer = new XmlSerializer(typeof(T));
bool result = deserializer.CanDeserialize(reader);
if (result)
{
// Get the object, if it's possible
obj = deserializer.Deserialize(reader) as T;
}
return result;
}
Vous n'avez pas besoin d'attribut, il vous suffit de transmettre les types connus au ctor du XmlSerializer. –
J'ai vu votre solution. Vous aurez toujours besoin de savoir quel type vous avez, c'est-à-dire if (res.GetType() == typeof (Tst1)). Je pense qu'il est tout aussi facile d'utiliser la méthode de type safe ci-dessus, qui est similaire à la syntaxe .Parse (..). Si vous n'avez pas besoin de savoir quel type a été désérialisé, votre méthode a plus de sens. –