2017-01-14 11 views
0

packageクラスをいくつか送信します。これをシリアル化してネットワーク経由で送信します。すべてのパッケージはAbstractPackageを拡張:オブジェクト型を実際の型にキャストする

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; 
    } 
} 

パッケージは、それがabstractPackageインスタンスにシリアライズされますとreadResponseが呼び出された他のコンピュータで受信された後。しかし、今、私はこのインスタンスが、私が持っているパッケージの種類ごとreadResponse関数のif文、私は別の30を持っている現時点では正確に(例えばUpdatePackage)

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

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

で、どのタイプかを決定する必要があります。もっと動的にこれを行う方法はありますか?

私はunityで作業しており、古いdotNetバージョンを使用しているため、dynamicキーワードは使用できません。

答えて

4

デリゲートへの型の辞書を使用して、その型のパッケージを受け取ったときに呼び出すことができます。だから、例えば:

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) { ... } 
    ... 
} 

(メソッドグループの変換が明らかに明確なあるように、私はそれぞれの「読み」の方法を作ったが、別の名前を持っています。)

+0

たぶん、より良いivamax9 @ジェネリック – ivamax9

+0

としてreadResponseを作るために:私は、呼び出し側がコンパイル時に型を知らないことが重要だと考えています。 –

+0

ええ、呼び出し元は、それがAbstractPackageであることだけを知っています。 –

関連する問題