簡體   English   中英

將對象實例轉換為實際類型

[英]Casting object instance to actual type

我發送了幾種不同的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。 但是現在我需要確定該實例的確切類型(例如UpdatePackage)

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

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

目前,對於每種包裝,在readResponse函數中有30種不同的if語句。 有沒有辦法可以更動態地做到這一點?

我無法使用dynamic關鍵字,因為我正在使用unity,並且它使用的是舊版本的dotNet。

當您收到該類型的程序包時,可以使用從類型到委托的字典來調用。 因此,例如:

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

(我使每個“讀取”方法都有一個不同的名稱,以便方法組轉換顯然是明確的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM