private EventDefinition ExposeEvent(TypeDefinition typeToProcess, FieldReference fieldToProcess, EventDefinition eventToExpose, ExposeMode exposeMode) { var typeToExpose = fieldToProcess.FieldType; var genericTypeToExpose = typeToExpose as GenericInstanceType; var eventToExposeType = genericTypeToExpose == null ? eventToExpose.EventType : eventToExpose.ResolveGenericEventType(genericTypeToExpose.GenericArguments); var name = exposeMode == ExposeMode.ImplementExplicit ? typeToExpose.FullName + "." + eventToExpose.Name : eventToExpose.Name; var @event = new EventDefinition(name, EventAttributes.None, eventToExposeType); var existingEvent = typeToProcess.GetEventLike(@event); if (existingEvent != null) { return(existingEvent); } if (eventToExpose.AddMethod != null && eventToExpose.AddMethod.IsPublic) { var addMethod = ExposeMethod(typeToProcess, fieldToProcess, eventToExpose.AddMethod, exposeMode, MethodSemanticsAttributes.AddOn); addMethod.SemanticsAttributes = MethodSemanticsAttributes.AddOn; @event.AddMethod = addMethod; } if (eventToExpose.RemoveMethod != null && eventToExpose.RemoveMethod.IsPublic) { var removeMethod = ExposeMethod(typeToProcess, fieldToProcess, eventToExpose.RemoveMethod, exposeMode, MethodSemanticsAttributes.RemoveOn); removeMethod.SemanticsAttributes = MethodSemanticsAttributes.RemoveOn; @event.RemoveMethod = removeMethod; } AddFodyGeneratedAttributes(@event); typeToProcess.Events.Add(@event); return(@event); }
private EventDefinition ExposeEvent(TypeDefinition typeToProcess, FieldReference fieldToProcess, EventDefinition eventToExpose, ExposeMode exposeMode) { var typeToExpose = fieldToProcess.FieldType; var genericTypeToExpose = typeToExpose as GenericInstanceType; var eventToExposeType = genericTypeToExpose == null ? eventToExpose.EventType : eventToExpose.ResolveGenericEventType(genericTypeToExpose.GenericArguments); var name = exposeMode == ExposeMode.ImplementExplicit ? typeToExpose.FullName + "." + eventToExpose.Name : eventToExpose.Name; var @event = new EventDefinition(name, EventAttributes.None, eventToExposeType); var existingEvent = typeToProcess.GetEventLike(@event); if (existingEvent != null) return existingEvent; if (eventToExpose.AddMethod != null && eventToExpose.AddMethod.IsPublic) { var addMethod = ExposeMethod(typeToProcess, fieldToProcess, eventToExpose.AddMethod, exposeMode, MethodSemanticsAttributes.AddOn); addMethod.SemanticsAttributes = MethodSemanticsAttributes.AddOn; @event.AddMethod = addMethod; } if (eventToExpose.RemoveMethod != null && eventToExpose.RemoveMethod.IsPublic) { var removeMethod = ExposeMethod(typeToProcess, fieldToProcess, eventToExpose.RemoveMethod, exposeMode, MethodSemanticsAttributes.RemoveOn); removeMethod.SemanticsAttributes = MethodSemanticsAttributes.RemoveOn; @event.RemoveMethod = removeMethod; } AddFodyGeneratedAttributes(@event); typeToProcess.Events.Add(@event); return @event; }