internal static RegisteredObject Create <T>(string objectId, T obj)
        {
            // Create description
            var objDesc = ObjectDescriptor.GetObjectDescription <T>();

            // Create events
            var events = new Dictionary <string, RegisteredEvent>();

            foreach (var eventInfo in ObjectDescriptor.GetEvents <T>())
            {
                // Create registered event
                var registeredEvent = RegisteredEvent.Create(objectId, obj, eventInfo);

                // Store registered event
                events.Add(eventInfo.Key, registeredEvent);
            }

            // Create properties
            var properties = new Dictionary <string, RegisteredProperty>();

            foreach (var propertyInfo in ObjectDescriptor.GetProperties <T>())
            {
                // Create registered property
                var registeredProperty = RegisteredProperty.Create(objectId, obj, propertyInfo);

                // Store registered property
                properties.Add(propertyInfo.Key, registeredProperty);
            }

            // Create methods
            var methods = new Dictionary <string, RegisteredMethod>();

            foreach (var methodInfo in ObjectDescriptor.GetMethods <T>())
            {
                // Create registered method
                var registeredMethod = RegisteredMethod.Create(objectId, obj, methodInfo);

                // Store registered method
                methods.Add(methodInfo.Key, registeredMethod);
            }

            return(new RegisteredObject(objectId, objDesc, obj, events, properties, methods));
        }
        public void EventNotificationWithArgsTest()
        {
            // Arrange
            string objectId = "objId1";

            _clientMock.Setup(o => o.Request(It.IsAny <IRequest>())).Returns <IRequest>((req) =>
            {
                var resp = new GetBindingDescriptionsResponse();
                resp.bindings.Add(objectId, ObjectDescriptor.GetObjectDescription <IRegisteredObject>());
                return(resp);
            });
            var sender = new Sender(_clientMock.Object);

            sender.Register <IRegisteredObject>();
            sender.SynchronizeBindings();
            _clientMock.Setup(o => o.Request(It.IsAny <SubscribeRequest>())).Returns <SubscribeRequest>(req =>
            {
                return(new SubscribeResponse()
                {
                    objectId = objectId,
                    eventId = ObjectDescriptor.GetEventId <IRegisteredObject>(nameof(IRegisteredObject.NotifyOnDataChanged))
                });
            });
            var  objProxy     = sender.GetBindingsByType <IRegisteredObject>()[objectId];
            bool argsReceived = false;

            objProxy.NotifyOnDataChanged += (s, e) => { argsReceived = e as DataChangedEventArgs != null; };
            var notification = new EventNotification()
            {
                objectId  = objectId,
                eventId   = ObjectDescriptor.GetEventId <IRegisteredObject>(nameof(IRegisteredObject.NotifyOnDataChanged)),
                eventArgs = new DataChangedEventArgs("dataChanged", 2)
            };

            // Act
            _clientMock.Raise(o => o.NotificationReceived += null, null, new Messages.NotificationEventArgs(notification));

            // Assert
            _clientMock.Verify();
            Assert.IsTrue(argsReceived);
        }