2009-08-30 4 views
0

У меня около 20 классов для разных сообщений, и это число растет. Каждый класс имеет уникальный идентификатор, поэтому я могу преобразовать класс по байт [] с помощью собственного метода сериализации, а затем снова преобразовать байт [] в мой класс с помощью этого уникального идентификатора. Все мои сообщения являются дочерними элементами класса BaseMessage, который уже правильно реализует уникальное поколение идентификаторов.C# Автоматический поиск класса детей по уникальному идентификатору

Что я хочу сделать, это прямое найти класс соответствующего идентификатора, не используя Enum для сравнения. Моя проблема с Enum в том, что Enums не обновляются автоматически с новыми идентификаторами каждый раз, когда я создаю новый класс сообщений.

Есть способ объединить атрибуты и сборку, чтобы сделать это, Как открыть всех детей BaseClass, а затем вызвать CustomAtributte?

Спасибо!

ответ

2

Вы на правильном пути - это действительно хороший способ справиться с этим. Вы захотите сохранить уникальный идентификатор типа рядом с сериализованным значением, чтобы вы могли прочитать идентификатор перед десериализацией, чтобы перенаправить десериализатор на нужный тип. Вы также можете просто сохранить полное имя типа вместо использования идентификатора, но это тоже прекрасный подход.

Атрибут достаточно прост, чтобы создать:

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); 
     } 
    } 
} 
+0

Благодарим за этот очень быстрый ответ. Вы уверены, что эта сборка по загрузке и цикличность типов быстро? Мне нужно сделать это для проверки много раз в моей программе. Я думаю, что могу создать этот список в статическое время и просто использовать после этого. –

+0

@ Густаво да, это довольно быстро. Вы, конечно, правы, что это нужно делать только один раз при запуске. После этого список можно кэшировать для жизни приложения. –

 Смежные вопросы

  • Нет связанных вопросов^_^