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