你走在正确的道路上——这听起来确实是处理它的好方法。您需要将类型的唯一 ID 与序列化值一起存储,以便您可以在反序列化之前读取 ID,以将反序列化器定向到正确的类型。您也可以只存储完全限定的类型名称而不是使用 ID,但这也是一种很好的方法。
该属性很简单,可以创建:
class MessageAttribute : Attribute
{
public Guid ID; //assuming you want to use a GUID, could be anything
}
而且使用起来也很简单:
[Message(ID = new Guid("..."))]
class SubMessage : BaseMessage
{
}
您可以加载给定程序集中的所有类型并非常快速地迭代它们:
List<Type> messageTypes = new List<Type>();
//get the assembly containing our types
Assembly messageAssembly = Assembly.Load(...);
//get all the types in the assembly
Type[] types = messageAssembly.GetTypes();
foreach(Type type in types)
{
//make sure we inherit from BaseMessage
if(type.IsAssignableFrom(typeof(BaseMessage))
{
//check to see if the inherited type has a MessageAttribute
object[] attribs = type.GetCustomAttribtues(typeof(MessageAttribute), true);
if(attribs.Length > 0)
{
messageTypes.Add(type);
}
}
}