public virtual void RegisterModelContextEvent <TSPObject, TDefinitionType>( ModelEventType actionType, Action <OnCreatingContext <TSPObject, TDefinitionType> > action) where TDefinitionType : DefinitionBase { if (action == null) { return; } if (!ModelContextEvents.ContainsKey(actionType)) { ModelContextEvents.Add(actionType, new List <object>()); } ModelContextEvents[actionType].Add(action); }
public virtual void InvokeOnModelContextEvents(object sender, ModelEventArgs eventArgs) { var eventType = eventArgs.EventType; // type.. can be null, so? var spObjectType = eventArgs.ObjectType; if (!ModelContextEvents.ContainsKey(eventType)) { return; } var targetEvents = ModelContextEvents[eventType]; // yea, yea.. foreach (MulticastDelegate action in targetEvents) { var modelContextType = typeof(OnCreatingContext <,>); var nonDefinition = new Type[] { spObjectType, typeof(DefinitionBase) }; var withDefinition = new Type[] { spObjectType, eventArgs.ObjectDefinition.GetType() }; var modelNonDefInstanceType = modelContextType.MakeGenericType(nonDefinition); var modelWithDefInstanceType = modelContextType.MakeGenericType(withDefinition); object modelContextInstance = null; if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelNonDefInstanceType)) { modelContextInstance = Activator.CreateInstance(modelNonDefInstanceType); } else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelWithDefInstanceType)) { modelContextInstance = Activator.CreateInstance(modelWithDefInstanceType); } SetProperty(modelContextInstance, "Model", eventArgs.Model); SetProperty(modelContextInstance, "CurrentModelNode", eventArgs.CurrentModelNode); SetProperty(modelContextInstance, "Object", eventArgs.Object); SetProperty(modelContextInstance, "ObjectDefinition", eventArgs.ObjectDefinition); action.DynamicInvoke(modelContextInstance); } }
public virtual void InvokeOnModelContextEvents(object sender, ModelEventArgs eventArgs) { var objectType = typeof(object); var eventType = eventArgs.EventType; // type.. can be null, so? var spObjectType = eventArgs.ObjectType; if (!ModelContextEvents.ContainsKey(eventType)) { TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Cannot find ModelContextEvents for eventType: [{0}]", eventType); return; } else { TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Calling ModelContextEvents for eventType: [{0}]", eventType); } var targetEvents = ModelContextEvents[eventType]; // yea, yea.. foreach (MulticastDelegate action in targetEvents) { var modelContextType = typeof(OnCreatingContext <,>); var nonDefinition = new Type[] { spObjectType, typeof(DefinitionBase) }; var withDefinition = new Type[] { spObjectType, eventArgs.ObjectDefinition.GetType() }; var nonObjectDefinition = new Type[] { objectType, typeof(DefinitionBase) }; var withObjectDefinition = new Type[] { objectType, eventArgs.ObjectDefinition.GetType() }; var modelNonDefInstanceType = modelContextType.MakeGenericType(nonDefinition); var modelWithDefInstanceType = modelContextType.MakeGenericType(withDefinition); var modelNonObjectDefInstanceType = modelContextType.MakeGenericType(nonObjectDefinition); var modelWithObjectDefInstanceType = modelContextType.MakeGenericType(withObjectDefinition); object modelContextInstance = null; if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelNonDefInstanceType)) { modelContextInstance = Activator.CreateInstance(modelNonDefInstanceType); } else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelWithDefInstanceType)) { modelContextInstance = Activator.CreateInstance(modelWithDefInstanceType); } else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelNonObjectDefInstanceType)) { modelContextInstance = Activator.CreateInstance(modelNonObjectDefInstanceType); } else if (action.Method.GetParameters()[0].ParameterType.IsAssignableFrom(modelWithObjectDefInstanceType)) { modelContextInstance = Activator.CreateInstance(modelWithObjectDefInstanceType); } if (modelContextInstance == null) { TraceService.ErrorFormat((int)LogEventId.ModelTreeModelContextEventIsNull, "Cannot find model content instance for method: [{0}]. Throwing SPMeta2Exception.", action.Method); throw new SPMeta2Exception("Cannot find a proper ModelContextEvents overload"); } TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [Model]: [{0}]", eventArgs.Model); SetProperty(modelContextInstance, "Model", eventArgs.Model); TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [CurrentModelNode]: [{0}]", eventArgs.CurrentModelNode); SetProperty(modelContextInstance, "CurrentModelNode", eventArgs.CurrentModelNode); TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [Object]: [{0}]", eventArgs.Object); SetProperty(modelContextInstance, "Object", eventArgs.Object); TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [ObjectDefinition]: [{0}]", eventArgs.ObjectDefinition); SetProperty(modelContextInstance, "ObjectDefinition", eventArgs.ObjectDefinition); TraceService.VerboseFormat((int)LogEventId.CoreCalls, "Setting property: [ModelHost]: [{0}]", eventArgs.ModelHost); SetProperty(modelContextInstance, "ModelHost", eventArgs.ModelHost); TraceService.Verbose((int)LogEventId.CoreCalls, "Invoking event."); action.DynamicInvoke(modelContextInstance); } }