C# 将对象实例强制转换为实际类型

C# 将对象实例强制转换为实际类型,c#,inheritance,unity3d,dynamic,casting,C#,Inheritance,Unity3d,Dynamic,Casting,我发送了几种不同类型的包类,我将它们序列化并通过网络发送。所有包都扩展了抽象包: 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 = p

我发送了几种不同类型的
类,我将它们序列化并通过网络发送。所有包都扩展了
抽象包

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)

目前,我在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) { ... }
    ...
}
class PackageReader
{
私有静态只读字典应答器;
静态PackageReader()
{
responseReaders=新字典();
RegisterReader(ReadUpdatePackage);
RegisterReader(读取下载包);
...
}
私有静态无效寄存器读取器(操作读取器)
{
动作d=程序包=>读卡器((T)程序包);
添加(类型为(T),d);
}
私有静态void ReadResponse(抽象包p)
{
responseReaders[p.GetType()].Invoke(p);
}
私有静态void ReadUpdatePackage(UpdatePackage p){…}
私有静态void ReadDownloadPackage(DownloadPackage){…}
...
}

(我已使每个“read”方法具有不同的名称,以便方法组转换明确无误。)

当收到该类型的包时,可以使用从类型到委托的字典进行调用。例如:

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) { ... }
    ...
}
class PackageReader
{
私有静态只读字典应答器;
静态PackageReader()
{
responseReaders=新字典();
RegisterReader(ReadUpdatePackage);
RegisterReader(读取下载包);
...
}
私有静态无效寄存器读取器(操作读取器)
{
动作d=程序包=>读卡器((T)程序包);
添加(类型为(T),d);
}
私有静态void ReadResponse(抽象包p)
{
responseReaders[p.GetType()].Invoke(p);
}
私有静态void ReadUpdatePackage(UpdatePackage p){…}
私有静态void ReadDownloadPackage(DownloadPackage){…}
...
}

(我让每个“read”方法都有一个不同的名称,这样方法组的转换就很清楚了。)

@ivamax9:我想问题是调用方在编译时不知道类型。是的,调用者只知道它是一个抽象包。@ivamax9:我想问题是调用者在编译时不知道它的类型。是的,调用者只知道它是一个抽象包。