/// <summary> /// Initializes the output event /// </summary> /// <param name="input">The input model element</param> /// <param name="output">The output model element</param> /// <param name="context">The transformation context</param> public override void Transform(T input, CodeMemberEvent output, ITransformationContext context) { CodeTypeReference eventArgsType = GetEventArgsType(input, context); output.Name = GetName(input); if (eventArgsType != null) { output.Type = new CodeTypeReference(typeof(EventHandler <>).Name, eventArgsType); } else { eventArgsType = new CodeTypeReference(typeof(EventArgs).Name); output.Type = new CodeTypeReference(typeof(EventHandler).Name); } var onChangedMethod = CodeDomHelper.CreateRaiseMethod(output, eventArgsType); output.DependentMembers(true).Add(onChangedMethod); }
/// <summary> /// Generates an OnChanged-pattern for the given property /// </summary> /// <param name="property">The code property</param> /// <returns>The statement to call the OnChanged method for the given property</returns> public static CodeStatement CreateOnChangedEventPattern(this CodeMemberProperty property, CodeTypeReference eventType, CodeExpression eventData) { CodeTypeReference handlerType; if (eventType == null) { handlerType = typeof(EventHandler).ToTypeReference(); } else { handlerType = typeof(EventHandler <>).ToTypeReference(eventType); } var changedEvent = new CodeMemberEvent() { Name = property.Name + "Changed", Type = handlerType, Attributes = MemberAttributes.Public | MemberAttributes.Final }; changedEvent.WriteDocumentation(string.Format("Gets fired when the {0} property changed its value", property.Name)); if (eventType == null) { eventType = new CodeTypeReference(typeof(EventArgs).Name); eventData = new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(eventType), "Empty"); } var onChanged = CodeDomHelper.CreateRaiseMethod(changedEvent, eventType); var dependent = property.DependentMembers(true); dependent.Add(onChanged); dependent.Add(changedEvent); var onChangedRef = new CodeMethodReferenceExpression(new CodeThisReferenceExpression(), onChanged.Name); return(new CodeExpressionStatement(new CodeMethodInvokeExpression(onChangedRef, eventData))); }