2017-01-14 7 views
0

Ich sende verschiedene Arten von package Klassen, die ich serialisieren und über das Netzwerk senden. Alle Pakete erweitern die AbstractPackage:Casting Objektinstanz zum tatsächlichen Typ

public abstract class AbstactPackage() {} 

public class UpdatePackage : AbstractPackage { 
    public float x, y, rot; 

    public UpdatePackage(float pX, float pY, float pRot) { 
     x = pX; y = pY; rot = pRot; 
    } 
} 

Nachdem das Paket auf dem anderen Computer empfangen wurde es in eine abstractPackage Instanz serialisiert wird und Readresponse aufgerufen. Aber jetzt muß ich feststellen, welche Art diese Instanz genau ist (z update)

private void readResponse(AbstractPackage p) { 
    if(p is UpdatePackage) readResponse(p as UpdatePackage); 
} 

private void readResponse(UpdatePackage p) { ... } 

Im Moment habe ich 30 verschiedene, wenn Anweisung in der Funktion Readresponse für jede Art von Paket, das ich habe. Kann ich das dynamischer machen?

Ich kann das dynamische Schlüsselwort nicht verwenden, weil ich mit Einheit arbeite und es eine alte dotNet-Version verwendet.

Antwort

4

Sie könnten ein Dictionary vom Typ zu einem Delegaten verwenden, der aufgerufen werden soll, wenn Sie ein Paket dieses Typs erhalten. So zum Beispiel:

class PackageReader 
{ 
    private static readonly Dictionary<Type, Action<AbstractPackage>> responseReaders; 

    static PackageReader() 
    { 
     responseReaders = new Dictionary<Type, Delegate>(); 
     RegisterReader<UpdatePackage>(ReadUpdatePackage); 
     RegisterReader<DownloadPackage>(ReadDownloadPackage); 
     ... 
    } 

    private static void RegisterReader<T>(Action<T> reader) 
    { 
     Action<AbstractPackage> d = package => reader((T) package); 
     responseReaders.Add(typeof(T), d); 
    } 

    private static void ReadResponse(AbstractPackage p) 
    { 
     responseReaders[p.GetType()].Invoke(p); 
    } 

    private static void ReadUpdatePackage(UpdatePackage p) { ... } 
    private static void ReadDownloadPackage(DownloadPackage p) { ... } 
    ... 
} 

(ich jede „lesen“ Methode vorgenommen habe einen anderen Namen hat, so dass die Methode Gruppenumwandlung deutlich eindeutig ist.)

+0

Vielleicht besser Readresponse als Gattungs – ivamax9

+0

@ ivamax9 machen : Ich vermute, der Punkt ist, dass der Aufrufer den Typ zur Kompilierzeit nicht kennen wird. –

+0

Ja, der Anrufer weiß nur, dass es ein AbstractPackage ist. –