public void SetRuntimeValue(Activity activity, object value)
        {
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }
            Activity dataSourceObject = Helpers.ParseActivityForBind(activity, this.Name);

            if (dataSourceObject != null)
            {
                MemberInfo memberInfo = GetMemberInfo(dataSourceObject.GetType(), this.Path, null);
                if (memberInfo != null)
                {
                    ActivityBind bind = GetMemberValue(dataSourceObject, memberInfo, this.Path, null) as ActivityBind;
                    if (bind != null)
                    {
                        bind.SetRuntimeValue(dataSourceObject, value);
                    }
                    else
                    {
                        MemberBind.SetValue(dataSourceObject, this.Path, value);
                    }
                }
            }
        }
 private static object GetMemberValue(object dataSourceObject, MemberInfo memberInfo, string path, Type targetType)
 {
     if (((memberInfo is FieldInfo) || (memberInfo is PropertyInfo)) || (memberInfo is EventInfo))
     {
         return(MemberBind.GetValue(memberInfo, dataSourceObject, path));
     }
     if ((targetType == null) || !(memberInfo is MethodInfo))
     {
         throw new InvalidOperationException(SR.GetString("Error_MemberNotFound"));
     }
     return(Delegate.CreateDelegate(targetType, dataSourceObject, (MethodInfo)memberInfo));
 }
        private static ActivityBind GetContextBind(ActivityBind activityBind, Activity activity, out Activity contextActivity)
        {
            if (activityBind == null)
            {
                throw new ArgumentNullException("activityBind");
            }
            if (activity == null)
            {
                throw new ArgumentNullException("activity");
            }
            BindRecursionContext context = new BindRecursionContext();
            ActivityBind         bind    = activityBind;

            contextActivity = activity;
            while (bind != null)
            {
                Activity activity2 = Helpers.ParseActivityForBind(contextActivity, bind.Name);
                if (activity2 == null)
                {
                    return(null);
                }
                object     dataContext = activity2;
                MemberInfo memberInfo  = GetMemberInfo(dataContext.GetType(), bind.Path, null);
                if (memberInfo == null)
                {
                    contextActivity = activity2;
                    return(bind);
                }
                if (memberInfo is FieldInfo)
                {
                    contextActivity = activity2;
                    return(bind);
                }
                if ((!(memberInfo is PropertyInfo) || !((memberInfo as PropertyInfo).PropertyType == typeof(ActivityBind))) || (dataContext == null))
                {
                    return(null);
                }
                object obj3 = MemberBind.GetValue(memberInfo, dataContext, bind.Path);
                if (!(obj3 is ActivityBind))
                {
                    return(null);
                }
                if (context.Contains(contextActivity, bind))
                {
                    return(null);
                }
                context.Add(contextActivity, bind);
                contextActivity = activity2;
                bind            = obj3 as ActivityBind;
            }
            return(bind);
        }
        internal static MemberInfo GetMemberInfo(Type dataSourceType, string path, Type targetType)
        {
            MemberInfo memberInfo = MemberBind.GetMemberInfo(dataSourceType, path);

            if (((targetType == null) || !typeof(Delegate).IsAssignableFrom(targetType)) || ((memberInfo != null) && (memberInfo is EventInfo)))
            {
                return(memberInfo);
            }
            MethodInfo  method = targetType.GetMethod("Invoke");
            List <Type> list   = new List <Type>();

            foreach (ParameterInfo info3 in method.GetParameters())
            {
                list.Add(info3.ParameterType);
            }
            return(dataSourceType.GetMethod(path, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance, null, list.ToArray(), null));
        }