C#Automatic按唯一ID查找子类

时间:2009-08-30 17:32:57

标签: c# .net serialization assemblies uniqueidentifier

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

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

有一种方法可以将Attributes和Assembly结合起来,就像发现BaseClass的所有子节点然后调用CustomAtributte一样?

谢谢!

1 个答案:

答案 0 :(得分: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);
        }
    }
}