public static void FillDelegate(ActivityDelegate activityDelegate, ActivityDelegateMetadata metadata) { foreach (ActivityDelegateArgumentMetadata argument in metadata) { activityDelegate.GetType().GetProperty(argument.Name).SetValue(activityDelegate, CreateDelegateArgument(argument), null); } }
public static ActivityDelegateMetadata GetMetadata(Type type) { ActivityDelegateMetadata metadata = new ActivityDelegateMetadata(); PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (PropertyInfo property in properties) { if (property.PropertyType.IsGenericType) { ActivityDelegateArgumentMetadata argument = null; if (property.PropertyType.GetGenericTypeDefinition() == typeof(DelegateInArgument <>)) { argument = new ActivityDelegateArgumentMetadata(); argument.Direction = ActivityDelegateArgumentDirection.In; } else if (property.PropertyType.GetGenericTypeDefinition() == typeof(DelegateOutArgument <>)) { argument = new ActivityDelegateArgumentMetadata(); argument.Direction = ActivityDelegateArgumentDirection.Out; } if (argument != null) { argument.Name = property.Name; argument.Type = property.PropertyType.GetGenericArguments()[0]; metadata.Add(argument); } } } return(metadata); }
public ActivityDelegate Create() { ActivityDelegate delegateObject = Activator.CreateInstance(this.DelegateType) as ActivityDelegate; ActivityDelegateMetadata metadata = ActivityDelegateUtilities.GetMetadata(this.DelegateType); ActivityDelegateUtilities.FillDelegate(delegateObject, metadata); return(delegateObject); }
private void FillArguments() { string propertyName = PropertyReferenceUtilities.GetPropertyReference(this.ModelItem.GetCurrentValue(), DelegatePropertyName); if (string.IsNullOrEmpty(propertyName)) { return; } ModelTreeManager manager = this.Context.Services.GetService <ModelTreeManager>(); DynamicActivityProperty property = DynamicActivityPropertyUtilities.Find(manager.Root.Properties["Properties"].Collection, propertyName); if (property == null || !property.Type.IsSubclassOf(typeof(ActivityDelegate))) { return; } ActivityDelegateMetadata metadata = ActivityDelegateUtilities.GetMetadata(property.Type); ModelItemCollection collection = this.ModelItem.Properties[DelegateArgumentsPropertyName].Value.Properties["ItemsCollection"].Collection; Type underlyingArgumentType = this.ModelItem.Properties[DelegateArgumentsPropertyName].Value.GetCurrentValue().GetType().GetGenericArguments()[1]; if (!typeof(Argument).IsAssignableFrom(underlyingArgumentType)) { return; } if (collection.Count == 0) { using (ModelEditingScope change = collection.BeginEdit(SR.FillDelegateArguments)) { Type dictionaryEntryType = typeof(ModelItemKeyValuePair <,>).MakeGenericType(new Type[] { typeof(string), underlyingArgumentType }); foreach (ActivityDelegateArgumentMetadata arg in metadata) { Argument argument = Argument.Create(arg.Type, arg.Direction == ActivityDelegateArgumentDirection.In ? ArgumentDirection.In : ArgumentDirection.Out); object mutableKVPair = Activator.CreateInstance(dictionaryEntryType, new object[] { arg.Name, argument }); ModelItem argumentKVPair = collection.Add(mutableKVPair); } change.Complete(); } } }
private void OnActivityDelegateChanged() { this.Arguments.Clear(); if (this.ActivityDelegate != null) { ActivityDelegateMetadata metadata = ActivityDelegateUtilities.GetMetadata(this.ActivityDelegate.ItemType); foreach (ActivityDelegateArgumentMetadata argument in metadata) { this.Arguments.Add(this.ActivityDelegate.Properties[argument.Name].Value); } this.isSetInternally = true; this.Handler = this.ActivityDelegate.Properties["Handler"].Value; this.isSetInternally = false; } else { this.isSetInternally = true; this.Handler = null; this.isSetInternally = false; } }
protected override void Execute(NativeActivityContext context) { StringBuilder errorBuilder = new StringBuilder(); InvokeDelegate activity = this.Activity.Get(context); string reference = PropertyReferenceUtilities.GetPropertyReference(activity, "Delegate"); if (reference != null) { DynamicActivityProperty property = null; ModelTreeManager manager = this.EditingContext.Services.GetService <ModelTreeManager>(); if (manager.Root.ItemType == typeof(ActivityBuilder)) { property = DynamicActivityPropertyUtilities.Find(manager.Root.Properties["Properties"].Collection, reference); } if (property == null) { this.EmitValidationError(context, string.Format(CultureInfo.CurrentUICulture, SR.PropertyReferenceNotResolved, reference)); return; } if (property.Type == typeof(ActivityDelegate)) { this.EmitValidationWarning(context, string.Format(CultureInfo.CurrentUICulture, SR.PropertyIsNotAConcreteActivityDelegate, reference)); return; } if (!property.Type.IsSubclassOf(typeof(ActivityDelegate))) { this.EmitValidationError(context, string.Format(CultureInfo.CurrentUICulture, SR.PropertyIsNotAnActivityDelegate, reference)); return; } if (property.Type.IsAbstract) { this.EmitValidationWarning(context, string.Format(CultureInfo.CurrentUICulture, SR.PropertyIsNotAConcreteActivityDelegate, reference)); return; } ActivityDelegateMetadata metadata = ActivityDelegateUtilities.GetMetadata(property.Type); if (activity.DelegateArguments.Count != metadata.Count) { this.EmitValidationWarning(context, SR.WrongNumberOfArgumentsForActivityDelegate); return; } foreach (ActivityDelegateArgumentMetadata expectedArgument in metadata) { Argument delegateArgument = null; if (activity.DelegateArguments.TryGetValue(expectedArgument.Name, out delegateArgument)) { if ((expectedArgument.Direction == ActivityDelegateArgumentDirection.In && delegateArgument.Direction != ArgumentDirection.In) || (expectedArgument.Direction == ActivityDelegateArgumentDirection.Out && delegateArgument.Direction != ArgumentDirection.Out)) { errorBuilder.AppendFormat(CultureInfo.CurrentUICulture, SR.DelegateArgumentsDirectionalityMismatch, expectedArgument.Name, delegateArgument.Direction, expectedArgument.Direction); } if (delegateArgument.ArgumentType != expectedArgument.Type) { if (expectedArgument.Direction == ActivityDelegateArgumentDirection.In) { if (!TypeHelper.AreTypesCompatible(delegateArgument.ArgumentType, expectedArgument.Type)) { errorBuilder.AppendFormat(CultureInfo.CurrentUICulture, SR.DelegateInArgumentTypeMismatch, expectedArgument.Name, expectedArgument.Type, delegateArgument.ArgumentType); } } else { if (!TypeHelper.AreTypesCompatible(expectedArgument.Type, delegateArgument.ArgumentType)) { errorBuilder.AppendFormat(CultureInfo.CurrentUICulture, SR.DelegateOutArgumentTypeMismatch, expectedArgument.Name, expectedArgument.Type, delegateArgument.ArgumentType); } } } } else { errorBuilder.AppendFormat(CultureInfo.CurrentUICulture, SR.DelegateArgumentMissing, expectedArgument.Name); } } if (errorBuilder.Length > 0) { this.EmitValidationWarning(context, errorBuilder.ToString()); } } }