0

我有大约 20 个针对不同消息的课程,而且这个数字还在增长。每个类都有一个唯一的 ID,因此我可以使用自己的序列化方法在 byte[] 上转换类,然后使用这个 uniqueID 在我的类上再次转换 byte[]。我所有的消息都是 BaseMessage 类的子类,该类已经正确实现了 uniqueID 生成。

我想要做的是直接查找相应 ID 的类,而不使用 Enum 进行比较。我对 Enum 的问题是,每次创建新消息类时,Enum 都不会自动更新为我的新 ID。

有一种方法可以结合 Attributes 和 Assembly 来做到这一点,比如发现 BaseClass 的所有孩子然后调用 CustomAtribute?

谢谢!

4

1 回答 1

2

你走在正确的道路上——这听起来确实是处理它的好方法。您需要将类型的唯一 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);
        }
    }
}
于 2009-08-30T17:37:14.617 回答