我有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
}
}