2009-10-27 4 views
1

Je tire des données sérialisées d'une base de données avec un type d'objet (où un champ contient le type d'objet et un autre contient une chaîne XML de données sérialisées).Puis-je implémenter un type générique et lui transmettre un type connu uniquement lors de l'exécution?

J'ai un sérialiseur générique qui a une sérialisation et de la méthode deserialize:

public static class Serializer<T> 
{ 
    public static string Serialize(T objectData) { } 
    public static T Deserialize(string xmlData) { } 
} 

Étant donné que le type d'objet est spécifié dans le champ de base de données, est-il un moyen pour moi de définir dynamiquement ce que T est ? - Ceci est ma ligne de pensée (bien que cela ne fonctionne pas):

Type t = Type.GetType(objectTypeName); 
t objData = Serializer<t>.Deserialize(objectXmlString); 

J'espérais factoriser un code sur une instruction switch où T est une valeur de consigne, mais je ne peux pas savoir si cela peut être fait, ou si oui, comment j'y arriverais.

Merci d'avance.

Répondre

5

Vous pouvez faire cela, mais il implique une réflexion - MakeGenericType, notamment:

typeof(Serializer<>).MakeGenericType(t).GetMethod("Deserialize").Invoke(...); 

Je n'ai pas terminé que, depuis votre exemple est source de confusion; la méthode est instance, mais est appelée comme si elle était statique.

Fait intéressant (peut-être), dynamic pourrait vous faciliter la tâche dans la version 4.0 - Je n'ai pas ma machine virtuelle à la main, mais imaginez:

static void SomeGenericMethod<T>(T arg) { Serializer<T>.SomeMethod(arg); } 
... 
dynamic obj = ... 
SomeGenericMethod(obj); 

Je avais besoin de vérifier, mais je attendre que ferait beaucoup de gros travaux pour nous.

L'autre approche courante consiste à exposer des méthodes qui fonctionnent sur un Type, plutôt que via des génériques.

+0

Wow! Je n'ai jamais su cela! Très utile. –

+0

Oops, ça va m'apprendre à coder directement dans SO. Je voulais vraiment les écrire comme des méthodes statiques. Merci d'avoir fait remarquer cela. – BenAlabaster

0

Non, mais il ne devrait pas être trop difficile de créer d'autres de vos surcharges des méthodes de sérialisation pour gérer cette exigence:

public string Serialize(Type objectType, object objectData) { } 
public object Deserialize(Type objectType, string xmlData) { } 

Les API de sérialisation dans .NET prennent tous Type cas comme paramètres de toute façon.

Questions connexes