[英]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.