C # Автоматический поиск класса детей по уникальному идентификатору - PullRequest
0 голосов
/ 30 августа 2009

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

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

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

Спасибо!

1 Ответ

2 голосов
/ 30 августа 2009

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

Атрибут достаточно прост для создания:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...