1 //----------------------------------------------------------------
2 // <copyright company="Microsoft Corporation">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 //----------------------------------------------------------------
7 namespace System.Activities.Presentation
9 using System.Activities.Presentation.Metadata;
10 using System.Activities.Presentation.Model;
11 using System.Collections.Generic;
12 using System.Reflection;
15 internal static class ActivityDelegateUtilities
17 public static ActivityDelegateMetadata GetMetadata(Type type)
19 ActivityDelegateMetadata metadata = new ActivityDelegateMetadata();
21 PropertyInfo[] properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
23 foreach (PropertyInfo property in properties)
25 if (property.PropertyType.IsGenericType)
27 ActivityDelegateArgumentMetadata argument = null;
28 if (property.PropertyType.GetGenericTypeDefinition() == typeof(DelegateInArgument<>))
30 argument = new ActivityDelegateArgumentMetadata();
31 argument.Direction = ActivityDelegateArgumentDirection.In;
33 else if (property.PropertyType.GetGenericTypeDefinition() == typeof(DelegateOutArgument<>))
35 argument = new ActivityDelegateArgumentMetadata();
36 argument.Direction = ActivityDelegateArgumentDirection.Out;
41 argument.Name = property.Name;
42 argument.Type = property.PropertyType.GetGenericArguments()[0];
43 metadata.Add(argument);
51 public static void FillDelegate(ActivityDelegate activityDelegate, ActivityDelegateMetadata metadata)
53 foreach (ActivityDelegateArgumentMetadata argument in metadata)
55 activityDelegate.GetType().GetProperty(argument.Name).SetValue(activityDelegate, CreateDelegateArgument(argument), null);
59 public static bool HasActivityDelegate(Type type)
61 return GetPropertiesByHeuristics(type).Count > 0;
64 public static List<ActivityDelegateInfo> CreateActivityDelegateInfo(ModelItem activity)
66 List<ActivityDelegateInfo> list = new List<ActivityDelegateInfo>();
68 foreach (PropertyInfo property in GetPropertiesByHeuristics(activity.ItemType))
70 list.Add(new ActivityDelegateInfo(activity, property.Name));
77 // A property is considered to be an ActivityDelegate when
78 // 1. it is a public instance property
79 // 2. it has a public getter and a public setter
80 // 3. its type is derived from ActivityDelegate
81 // 4. can create an isntance of its type
82 private static List<PropertyInfo> GetPropertiesByHeuristics(Type activityType)
84 List<PropertyInfo> result = new List<PropertyInfo>();
86 PropertyInfo[] properties = activityType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
87 foreach (PropertyInfo property in properties)
89 if (property.GetGetMethod() != null &&
90 property.GetSetMethod() != null &&
91 property.PropertyType.IsSubclassOf(typeof(ActivityDelegate)) &&
92 TypeUtilities.CanCreateInstanceUsingDefaultConstructor(property.PropertyType))
98 result.Sort(new PropertyInfoComparer());
103 private static DelegateArgument CreateDelegateArgument(ActivityDelegateArgumentMetadata argument)
105 DelegateArgument delegateArgument = null;
106 if (argument.Direction == ActivityDelegateArgumentDirection.In)
108 delegateArgument = Activator.CreateInstance(typeof(DelegateInArgument<>).MakeGenericType(argument.Type)) as DelegateArgument;
112 delegateArgument = Activator.CreateInstance(typeof(DelegateOutArgument<>).MakeGenericType(argument.Type)) as DelegateArgument;
115 delegateArgument.Name = argument.Name;
117 return delegateArgument;
120 private class PropertyInfoComparer : IComparer<PropertyInfo>
122 public int Compare(PropertyInfo x, PropertyInfo y)
124 Fx.Assert(x != null, "x should not be null");
125 Fx.Assert(y != null, "y should not be null");
127 return StringComparer.Ordinal.Compare(x.Name, y.Name);