public override EventDescriptorCollection GetEvents(Attribute[] attributes)
        {
            var sourceEvents = base.GetEvents(attributes);

            if ((sourceEvents == null) || (sourceEvents.Count == 0))
            {
                return(sourceEvents);
            }

            var entry         = this.GetEntry();
            var replaceEvents = default(Dictionary <EventDescriptor, DataItemEventDescriptorBase>);

            lock ( entry )
            {
                replaceEvents = entry.Events;

                if (replaceEvents == null)
                {
                    replaceEvents = new Dictionary <EventDescriptor, DataItemEventDescriptorBase>();
                    entry.Events  = replaceEvents;

                    var factory = new DataItemEventDescriptorFactory(this);

                    foreach (var sourceEvent in sourceEvents.Cast <EventDescriptor>())
                    {
                        var descriptor = factory.CreateEventDescriptor(sourceEvent);
                        if (descriptor != null)
                        {
                            replaceEvents.Add(sourceEvent, descriptor);
                        }
                    }
                }

                if (replaceEvents.Count == 0)
                {
                    return(sourceEvents);
                }
            }

            var destinationEvents = new EventDescriptor[sourceEvents.Count];

            for (int i = 0; i < sourceEvents.Count; i++)
            {
                var sourceEvent = sourceEvents[i];

                DataItemEventDescriptorBase destinationEvent;
                if (replaceEvents.TryGetValue(sourceEvent, out destinationEvent))
                {
                    destinationEvents[i] = destinationEvent;
                }
                else
                {
                    destinationEvents[i] = sourceEvent;
                }
            }

            return(new EventDescriptorCollection(destinationEvents));
        }
Exemple #2
0
        internal DataItemEventDescriptor CreateEventDescriptor(EventDescriptor source)
        {
            if (!DataItemEventDescriptorFactory.IsReflected(source))
            {
                return(null);
            }

            var componentType = source.ComponentType;

            EventInfo eventInfo;

            try
            {
                eventInfo = componentType.GetEvent(source.Name, BindingFlags.Public | BindingFlags.Instance);
                if (eventInfo == null)
                {
                    return(null);
                }
            }
            catch (AmbiguousMatchException)
            {
                return(null);
            }

            var handlerType = eventInfo.EventHandlerType;

            Debug.Assert(handlerType == source.EventType);

            var creatorHelper = DelegateCreatorHelperFactory.CreateHelper(componentType, handlerType);

            var addHandler = DataItemEventDescriptorFactory.CreateAddHandler(eventInfo, creatorHelper);

            if (addHandler == null)
            {
                return(null);
            }

            var removeHandler = DataItemEventDescriptorFactory.CreateRemoveHandler(eventInfo, creatorHelper);

            if (removeHandler == null)
            {
                return(null);
            }

            return(new DataItemEventDescriptor(m_typeDescriptor, source, componentType, handlerType, addHandler, removeHandler));
        }