/// <summary> /// Gets the C# code defining the specified event. /// </summary> public static string GetDefinition(EventDefinition @event) { var definitionBuilder = new StringBuilder(); AppendCustomAttributes(definitionBuilder, @event.GetCustomAttributes()); // "public" if (@event.AddMethod?.IsPublic == true || @event.RemoveMethod?.IsPublic == true) { definitionBuilder.Append("public "); } // "static" if (@event.AddMethod?.IsStatic == true || @event.RemoveMethod?.IsStatic == true) { definitionBuilder.Append("static "); } // "event" definitionBuilder.Append("event "); // event type definitionBuilder.Append(GetDisplayName(@event.EventType)); definitionBuilder.Append(" "); // event name definitionBuilder.Append(@event.Name); definitionBuilder.Append(";"); return(definitionBuilder.ToString()); }
private IEnumerable <CilCustomAttribute> GetCustomAttributes() { foreach (var handle in _eventDefinition.GetCustomAttributes()) { var attribute = _readers.MdReader.GetCustomAttribute(handle); yield return(new CilCustomAttribute(attribute, ref _readers)); } }
public static void AddDependenciesDueToCustomAttributes(ref DependencyList dependencies, NodeFactory factory, EcmaMethod method) { MetadataReader reader = method.MetadataReader; MethodDefinitionHandle methodHandle = method.Handle; MethodDefinition methodDef = reader.GetMethodDefinition(methodHandle); // Handle custom attributes on the method AddDependenciesDueToCustomAttributes(ref dependencies, factory, method.Module, methodDef.GetCustomAttributes()); // Handle custom attributes on method parameters foreach (ParameterHandle parameterHandle in methodDef.GetParameters()) { Parameter parameter = reader.GetParameter(parameterHandle); AddDependenciesDueToCustomAttributes(ref dependencies, factory, method.Module, parameter.GetCustomAttributes()); } // Handle custom attributes on generic method parameters foreach (GenericParameterHandle genericParameterHandle in methodDef.GetGenericParameters()) { GenericParameter parameter = reader.GetGenericParameter(genericParameterHandle); AddDependenciesDueToCustomAttributes(ref dependencies, factory, method.Module, parameter.GetCustomAttributes()); } // We don't model properties and events as separate entities within the compiler, so ensuring // we can generate custom attributes for the associated events and properties from here // is as good as any other place. // // As a performance optimization, we look for associated events and properties only // if the method is SpecialName. This is required for CLS compliance and compilers we // care about emit accessors like this. if ((methodDef.Attributes & MethodAttributes.SpecialName) != 0) { TypeDefinition declaringType = reader.GetTypeDefinition(methodDef.GetDeclaringType()); foreach (PropertyDefinitionHandle propertyHandle in declaringType.GetProperties()) { PropertyDefinition property = reader.GetPropertyDefinition(propertyHandle); PropertyAccessors accessors = property.GetAccessors(); if (accessors.Getter == methodHandle || accessors.Setter == methodHandle) { AddDependenciesDueToCustomAttributes(ref dependencies, factory, method.Module, property.GetCustomAttributes()); } } foreach (EventDefinitionHandle eventHandle in declaringType.GetEvents()) { EventDefinition @event = reader.GetEventDefinition(eventHandle); EventAccessors accessors = @event.GetAccessors(); if (accessors.Adder == methodHandle || accessors.Remover == methodHandle || accessors.Raiser == methodHandle) { AddDependenciesDueToCustomAttributes(ref dependencies, factory, method.Module, @event.GetCustomAttributes()); } } } }