Domanda

Ho circa 20 classi per i diversi messaggi e questo numero sono in crescita. Ogni classe ha un ID univoco, così posso trasformare la classe su un byte [] con il mio metodo di serializzazione e poi trasformare un byte [] di nuovo sulla mia classe con questo uniqueID. Tutti i miei messaggi sono figli di una classe che implementa BaseMessage già la generazione uniqueID correttamente.

Quello che voglio fare è diretta trovare la classe di un rispettivo ID senza utilizzare un Enum per confrontare. Il mio problema con l'Enum è che Enums non vengono automaticamente aggiornati con i miei nuovi ID ogni volta che creo una nuova classe di segnalazione.

C'è un modo per combinare attributi e Assemblea per fare questo, come scoprire tutti i bambini di BaseClass e quindi chiamare per un CustomAtributte?

Grazie!

È stato utile?

Soluzione

Sei sulla strada giusta - che suona come un buon modo per gestire la cosa. Ti consigliamo di memorizzare l'ID univoco del tipo a fianco il valore serializzato, in modo da poter leggere l'ID prima di deserializzazione, per dirigere il deserializzatore al tipo corretto. Si potrebbe anche solo di memorizzare il nome di tipo completo invece di utilizzare un ID, ma questo è un approccio troppo bene.

L'attributo è abbastanza semplice da creare:

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

E l'utilizzo è anche semplice:

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

È possibile caricare tutti i tipi in un dato complesso e iterare su di loro molto rapidamente:

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);
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top