2

すべて EventDto から継承する 20 ほどのイベント クラスがあります。これらのサブクラスはすべてシリアル化/逆シリアル化されます (DataContractJsonSerializer を使用し、各サブクラスが [KnownType(typeof(subclasstype))] 属性として追加されます)。逆シリアル化方法は次のようになります。

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) に変更する方法はありますか?

4

3 に答える 3

1

最も簡単な方法は、is演算子を使用することです。

public void Process(EventDto eventDto)
{
   //Do nothing
   if (eventDto is EventDtoSubclass1)
   {
       // do something   
   }
   else if (eventDto is EventDtoSubclass2)
   {
       // do something else
   }
}
于 2013-07-18T20:31:59.670 に答える