我有20个左右的事件类,它们都从EventDto继承。这些子类都被序列化/反序列化(使用DataContractJsonSerializer,每个子类都添加为[KnownType(typeof(suboftype))]属性),反序列化方法如下所示:

private EventDto DeserializeMessage(byte[] body)
    {
        var stream = new MemoryStream(body);
        var serializer = new DataContractJsonSerializer(typeof(EventDto));

        var eventDto = (EventDto)serializer.ReadObject(stream);

        return eventDto;
    }


反序列化事件后,我需要根据事件的类型对其进行处理。所以我有:

public void ProcessMessage(byte[] serializedEvent)
    {
        //Deserialize
        var eventDto = DeserializeMessage(serializedEvent);

        //Process
        Process(eventDto);
    }

public void Process(EventDto eventDto)
    {
        //Do nothing
    }

    public void Process(EventDtoSubclass1 eventDto)
    {
        //Do something
    }

    public void Process(EventDtoSubclass2 eventDto)
    {
        //Do something different
    }


问题在于ProcessMessage()中的eventDto具有EventDto的引用类型,因此调用的Process()方法始终相同。我需要能够区分EventDto的不同子类并调用适当的方法。

有什么方法可以将ProcessMessage()中的eventDto类型从EventDto更改为其实际派生类型(例如EventDtoSubclass2)?

最佳答案

最简单的方法是使用is运算符。

public void Process(EventDto eventDto)
{
   //Do nothing
   if (eventDto is EventDtoSubclass1)
   {
       // do something
   }
   else if (eventDto is EventDtoSubclass2)
   {
       // do something else
   }
}

08-17 14:55