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