private void RegisterEvent(RegisterEvent registerEventMessage)
        {
            var instance       = simpleInstanceService.instances[registerEventMessage.InstanceId].Instance;
            var instanceType   = instance.GetType();
            var eventSignature = instanceType.GetEvent(registerEventMessage.EventName);

            if (eventSignature == null)
            {
                throw new ArgumentException($"{nameof(RegisterEvent)}: Unable to load event '{registerEventMessage.EventName}' for type '{instanceType.Name}'");
            }

            var eventType = Type.GetType(registerEventMessage.EventHandlerTypeArg);

            if (eventType == null)
            {
                throw new ArgumentException($"{nameof(RegisterEvent)}: Unable to load type '{registerEventMessage.EventHandlerTypeArg}' for event '{registerEventMessage.EventName}'");
            }

            var wrapperType = typeof(EventHandlerWrapper <>).MakeGenericType(eventType);

            var wrapper = (IEventWrapper)Activator.CreateInstance(wrapperType, this, registerEventMessage.InstanceId, registerEventMessage.EventHandleId);

            var delegateMethod = Delegate.CreateDelegate(eventSignature.EventHandlerType, wrapper, nameof(EventHandlerWrapper <object> .OnEvent));

            eventSignature.AddEventHandler(instance, delegateMethod);
            wrapper.Unregister = () => eventSignature.RemoveEventHandler(instance, delegateMethod);
            events.Add(wrapper.EventHandleId, wrapper);
        }
Exemple #2
0
        private void RegisterEvent(RegisterEvent registerEventMessage)
        {
            var instance       = simpleInstanceService.instances[registerEventMessage.InstanceId].Instance;
            var eventSignature = instance.GetType().GetEvent(registerEventMessage.EventName);

            // TODO: This can be cached.
            var wrapperType = typeof(EventHandlerWrapper <>)
                              .MakeGenericType(Type.GetType(registerEventMessage.EventHandlerTypeArg));

            var wrapper        = (IEventWrapper)Activator.CreateInstance(wrapperType, this, registerEventMessage.InstanceId, registerEventMessage.EventHandleId);
            var delegateMethod = Delegate.CreateDelegate(eventSignature.EventHandlerType, wrapper, nameof(EventHandlerWrapper <object> .OnEvent));

            eventSignature.AddEventHandler(instance, delegateMethod);
            wrapper.Unregister = () => eventSignature.RemoveEventHandler(instance, delegateMethod);
            events.Add(wrapper.EventHandleId, wrapper);
        }