有什么方法可以将 ProcessMessage() 中的 eventDto 类型从 EventDto 更改为其实际派生类型(例如 EventDtoSubclass2)?
不。您要么提前知道类型(并且可以强制转换它或将其用作泛型类型参数或其他),要么您必须在事后检测它并对其进行分支。由于您似乎不提前知道您得到了什么,因此您需要检测它并对其进行分支(我的意思是使用is
/as
或GetType
/typeof
或任何您最喜欢的检查方法)。
作为一种替代方案,如果您可以更改 EventDto 派生类,则可以潜在地将虚拟 Process 函数添加到基类中,并在每个派生类中执行正确的操作的覆盖版本。不过,这取决于 Process 实际上做了什么。
编辑:由于 I4V 说它不起作用,我将在这里放一个完整的程序来展示我对我的替代方案的意思。就像我多次说过的那样,除非我们知道 Process 需要做什么,否则我们不知道这是否真的适用于 OP。但它在原则上确实有效。
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;
namespace SOTest
{
class Program
{
static void Main(string[] args)
{
Program program = new Program();
EventDtoA a = new EventDtoA() { AProperty = 0, BaseProperty = -1 };
EventDtoB b = new EventDtoB() { BProperty = 1, BaseProperty = -1 };
EventDtoC c = new EventDtoC() { CProperty = 2, BaseProperty = -1 };
var aBytes = program.SerializeMessage(a);
var bBytes = program.SerializeMessage(b);
var cBytes = program.SerializeMessage(c);
var aString = System.Text.Encoding.UTF8.GetString(aBytes);
EventDto aNew = program.DeserializeMessage(aBytes);
EventDto bNew = program.DeserializeMessage(bBytes);
EventDto cNew = program.DeserializeMessage(cBytes);
aNew.Process();
bNew.Process();
cNew.Process();
Console.ReadKey();
}
private byte[] SerializeMessage(EventDto eventDto)
{
var stream = new MemoryStream();
var serializer = new DataContractJsonSerializer(typeof(EventDto));
serializer.WriteObject(stream, eventDto);
var tempBytes = new Byte[stream.Length];
Array.Copy(stream.GetBuffer(), tempBytes, stream.Length);
return tempBytes;
}
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
eventDto.Process();
}
}
[KnownType(typeof(EventDtoA))]
[KnownType(typeof(EventDtoB))]
[KnownType(typeof(EventDtoC))]
public class EventDto
{
public virtual void Process()
{
Console.WriteLine("From EventDto Base Class");
}
public int BaseProperty { get; set; }
}
public class EventDtoA : EventDto
{
public override void Process()
{
Console.WriteLine("From EventDto A");
}
public int AProperty { get; set; }
}
public class EventDtoB : EventDto
{
public override void Process()
{
Console.WriteLine("From EventDto B");
}
public int BProperty { get; set; }
}
public class EventDtoC : EventDto
{
public override void Process()
{
Console.WriteLine("From EventDto C");
}
public int CProperty { get; set; }
}
}
输出:
From EventDto A
From EventDto B
From EventDto C