private void ProcessTypeConverter(object message, object tag)
 {
     MessageHandlerFactory.TypeConverter typeConverter = (MessageHandlerFactory.TypeConverter)message;
     if (typeConverter.Dictionary == null)
     {
         throw new ArgumentException("Dictionary is null.", "converter");
     }
     foreach (KeyValuePair <int, Type> keyValuePair in typeConverter.Dictionary)
     {
         int  key   = keyValuePair.Key;
         Type value = keyValuePair.Value;
         if (MessageHandlerFactory.Validate(value))
         {
             typeof(ClassInfo <>).MakeGenericType(new Type[]
             {
                 value
             }).GetProperty("CategoryId").SetValue(null, key, null);
             MessageHandlerFactory.Category category;
             MessageHandlerFactory.Handler  handler;
             if (this.categoryDict.TryGetValue(key, out category))
             {
                 if (!(category.type == value))
                 {
                     throw new InvalidOperationException(string.Format("CategoryId '{0}' is already used.", key));
                 }
             }
             else if (this.handlerDict.TryGetValue(value, out handler))
             {
                 if (!value.IsSealed || handler.packetHandler == null)
                 {
                     throw new InvalidOperationException(string.Format("'{0}' is not sealed.", value.AssemblyQualifiedName));
                 }
                 this.categoryDict.Add(key, new MessageHandlerFactory.Category
                 {
                     type          = value,
                     packetHandler = handler.packetHandler
                 });
             }
         }
     }
 }