2009-08-30 9 views
0

J'ai environ 20 classes pour différents messages et ce nombre augmente. Chaque classe a un identifiant unique, donc je peux transformer la classe sur un byte [] avec ma propre méthode de sérialisation, puis transformer à nouveau un byte [] sur ma classe avec cet uniqueID. Tous mes messages sont des enfants d'une classe BaseMessage qui implémente déjà la génération uniqueID correctement.C# Recherche automatique d'une classe enfant par un ID unique

Ce que je veux faire est de trouver directement la classe d'un ID respectif sans utiliser Enum pour comparer. Mon problème avec Enum est que les Enums ne sont pas automatiquement mis à jour avec mes nouveaux ID chaque fois que je crée une nouvelle classe de message.

Il existe un moyen de combiner les attributs et l'assemblage pour ce faire, comme découvrir tous les enfants de BaseClass et ensuite appeler un CustomAtributte?

Merci!

Répondre

2

Vous êtes sur la bonne voie - cela semble être un bon moyen de le gérer. Vous devez stocker l'ID unique du type à côté de la valeur sérialisée, afin que vous puissiez lire l'ID avant la désérialisation, pour diriger le désérialiseur vers le type correct. Vous pouvez également simplement stocker le nom de type complet au lieu d'utiliser un ID, mais c'est également une bonne approche.

L'attribut est assez simple pour créer:

class MessageAttribute : Attribute 
{ 
    public Guid ID; //assuming you want to use a GUID, could be anything 
} 

Et en utilisant c'est aussi simple:

[Message(ID = new Guid("..."))] 
class SubMessage : BaseMessage 
{ 
} 

Vous pouvez charger tous les types dans un assemblage donné et itérer sur eux très rapidement:

List<Type> messageTypes = new List<Type>(); 

//get the assembly containing our types 
Assembly messageAssembly = Assembly.Load(...); 

//get all the types in the assembly 
Type[] types = messageAssembly.GetTypes(); 
foreach(Type type in types) 
{ 
    //make sure we inherit from BaseMessage 
    if(type.IsAssignableFrom(typeof(BaseMessage)) 
    { 
     //check to see if the inherited type has a MessageAttribute 
     object[] attribs = type.GetCustomAttribtues(typeof(MessageAttribute), true); 
     if(attribs.Length > 0) 
     { 
      messageTypes.Add(type); 
     } 
    } 
} 
+0

Merci pour cette réponse très rapide. Etes-vous sûr que le chargement de l'assemblage et le bouclage de type sont rapides? J'ai besoin de faire cette vérification beaucoup de fois sur mon programme. Je pense que je peux créer cette liste sur une période statique et juste utiliser après cela. –

+0

@Gustavo oui, c'est assez rapide. Vous avez raison, bien sûr, cela ne doit être fait qu'une seule fois au démarrage. La liste peut être mise en cache pour la vie de l'application après cela. –

Questions connexes