private object InternalGetRuntimeValue(Activity activity, Type targetType)
        {
            object   runtimeValue     = null;
            Activity dataSourceObject = Helpers.ParseActivityForBind(activity, this.Name);

            if (dataSourceObject != null)
            {
                MemberInfo memberInfo = GetMemberInfo(dataSourceObject.GetType(), this.Path, targetType);
                if (memberInfo != null)
                {
                    runtimeValue = GetMemberValue(dataSourceObject, memberInfo, this.Path, targetType);
                    if ((runtimeValue is ActivityBind) && (BindHelpers.GetMemberType(memberInfo) != typeof(ActivityBind)))
                    {
                        runtimeValue = ((ActivityBind)runtimeValue).GetRuntimeValue(dataSourceObject, targetType);
                    }
                    return(runtimeValue);
                }
                DependencyProperty.FromName(this.Path, Helpers.GetRootActivity(activity).GetType());
            }
            return(runtimeValue);
        }
Example #2
0
        public bool WalkProperties(Activity activity, object obj)
        {
            Activity currentActivity = obj as Activity;

            PropertyInfo[] props = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
            foreach (PropertyInfo prop in props)
            {
                // !!Work around: no indexer property walking
                if (prop.GetIndexParameters() != null && prop.GetIndexParameters().Length > 0)
                {
                    continue;
                }

                DesignerSerializationVisibility visibility = GetSerializationVisibility(prop);
                if (visibility == DesignerSerializationVisibility.Hidden)
                {
                    continue;
                }

                //Try to see if we have dynamic property associated with the object on the same object
                //if so then we should compare if the dynamic property values match with the property type
                //if not we bail out
                object             propValue          = null;
                DependencyProperty dependencyProperty = DependencyProperty.FromName(prop.Name, obj.GetType());
                if (dependencyProperty != null && currentActivity != null)
                {
                    if (currentActivity.IsBindingSet(dependencyProperty))
                    {
                        propValue = currentActivity.GetBinding(dependencyProperty);
                    }
                    else
                    {
                        propValue = currentActivity.GetValue(dependencyProperty);
                    }
                }
                else
                {
                    try
                    {
                        propValue = prop.CanRead ? prop.GetValue(obj, null) : null;
                    }
                    catch
                    {
                        // Eat exceptions that occur while invoking the getter.
                    }
                }

                if (FoundProperty != null)
                {
                    WalkerEventArgs args = new WalkerEventArgs(activity, propValue, prop, obj);
                    FoundProperty(this, args);
                    if (args.Action == WalkerAction.Skip)
                    {
                        continue;
                    }
                    else if (args.Action == WalkerAction.Abort)
                    {
                        return(false);
                    }
                }

                if (propValue is IList)
                {
                    //We do not need to reflect on the properties of the list
                    foreach (object childObj in (IList)propValue)
                    {
                        if (FoundProperty != null)
                        {
                            WalkerEventArgs args = new WalkerEventArgs(activity, childObj, null, propValue);
                            FoundProperty(this, args);
                            if (args.Action == WalkerAction.Skip)
                            {
                                continue;
                            }
                            else if (args.Action == WalkerAction.Abort)
                            {
                                return(false);
                            }
                        }
                        if (childObj != null && IsBrowsableType(childObj.GetType()))
                        {
                            if (!WalkProperties(activity, childObj))
                            {
                                return(false);
                            }
                        }
                    }
                }
                else if (propValue != null && IsBrowsableType(propValue.GetType()))
                {
                    if (!WalkProperties(activity, propValue))
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }
Example #3
0
 public object GetRealObject(StreamingContext context)
 {
     return(DependencyProperty.FromName(this.name, this.type));
 }
Example #4
0
 public object GetRealObject(StreamingContext context)
 {
     return(DependencyProperty.FromName(property_name, owner_type));
 }
Example #5
0
        internal static object GetValue(MemberInfo memberInfo, object dataContext, string path)
        {
            PathWalker walker;

            if (memberInfo == null)
            {
                throw new ArgumentNullException("memberInfo");
            }
            if (dataContext == null)
            {
                throw new ArgumentNullException("dataContext");
            }
            if (path == null)
            {
                path = string.Empty;
            }
            if (string.IsNullOrEmpty(path))
            {
                return(null);
            }
            object targetObject = dataContext;
            Type   memberType   = dataContext.GetType();

            if (!new PathWalker {
                MemberFound = (EventHandler <PathMemberInfoEventArgs>) Delegate.Combine(walker.MemberFound, delegate(object sender, PathMemberInfoEventArgs eventArgs) {
                    if (targetObject == null)
                    {
                        eventArgs.Action = PathWalkAction.Cancel;
                        return;
                    }
                    switch (eventArgs.MemberKind)
                    {
                    case PathMemberKind.Field:
                        memberType = (eventArgs.MemberInfo as FieldInfo).FieldType;
                        targetObject = (eventArgs.MemberInfo as FieldInfo).GetValue(targetObject);
                        goto Label_01CC;

                    case PathMemberKind.Event:
                        {
                            EventInfo memberInfo = eventArgs.MemberInfo as EventInfo;
                            memberType = memberInfo.EventHandlerType;
                            DependencyObject obj1 = targetObject as DependencyObject;
                            DependencyProperty dependencyProperty = DependencyProperty.FromName(memberInfo.Name, obj1.GetType());
                            if ((dependencyProperty == null) || (obj1 == null))
                            {
                                targetObject = null;
                                break;
                            }
                            if (!obj1.IsBindingSet(dependencyProperty))
                            {
                                targetObject = obj1.GetHandler(dependencyProperty);
                                break;
                            }
                            targetObject = obj1.GetBinding(dependencyProperty);
                            break;
                        }

                    case PathMemberKind.Property:
                        memberType = (eventArgs.MemberInfo as PropertyInfo).PropertyType;
                        if ((eventArgs.MemberInfo as PropertyInfo).CanRead)
                        {
                            targetObject = (eventArgs.MemberInfo as PropertyInfo).GetValue(targetObject, null);
                            goto Label_01CC;
                        }
                        eventArgs.Action = PathWalkAction.Cancel;
                        return;

                    case PathMemberKind.IndexedProperty:
                        memberType = (eventArgs.MemberInfo as PropertyInfo).PropertyType;
                        if ((eventArgs.MemberInfo as PropertyInfo).CanRead)
                        {
                            targetObject = (eventArgs.MemberInfo as PropertyInfo).GetValue(targetObject, eventArgs.IndexParameters);
                            goto Label_01CC;
                        }
                        eventArgs.Action = PathWalkAction.Cancel;
                        return;

                    case PathMemberKind.Index:
                        memberType = (eventArgs.MemberInfo as PropertyInfo).PropertyType;
                        targetObject = (eventArgs.MemberInfo as PropertyInfo).GetValue(targetObject, BindingFlags.GetProperty, null, eventArgs.IndexParameters, CultureInfo.InvariantCulture);
                        goto Label_01CC;

                    default:
                        goto Label_01CC;
                    }
                    eventArgs.Action = PathWalkAction.Stop;
                    Label_01CC:
                    if (targetObject != null)
                    {
                        return;
                    }
                    if (!eventArgs.LastMemberInThePath)
                    {
                        throw new InvalidOperationException(SR.GetString("Error_BindPathNullValue", new object[] { eventArgs.Path }));
                    }
                    eventArgs.Action = PathWalkAction.Cancel;
                })
            }.TryWalkPropertyPath(memberType, path))
            {
                return(null);
            }
            if (targetObject == dataContext)
            {
                return(null);
            }
            return(targetObject);
        }
        internal static object ResolveActivityPath(Activity refActivity, string path)
        {
            PathWalker walker;

            if (refActivity == null)
            {
                throw new ArgumentNullException("refActivity");
            }
            if (path == null)
            {
                throw new ArgumentNullException("path");
            }
            if (path.Length == 0)
            {
                throw new ArgumentException(SR.GetString("Error_EmptyPathValue"), "path");
            }
            object value = refActivity;
            BindRecursionContext recursionContext = new BindRecursionContext();

            if (new PathWalker {
                MemberFound = (EventHandler <PathMemberInfoEventArgs>) Delegate.Combine(walker.MemberFound, delegate(object sender, PathMemberInfoEventArgs eventArgs) {
                    if (value == null)
                    {
                        eventArgs.Action = PathWalkAction.Cancel;
                    }
                    else
                    {
                        switch (eventArgs.MemberKind)
                        {
                        case PathMemberKind.Field:
                            try
                            {
                                value = (eventArgs.MemberInfo as FieldInfo).GetValue(value);
                            }
                            catch (Exception exception)
                            {
                                value = null;
                                eventArgs.Action = PathWalkAction.Cancel;
                                if (!refActivity.DesignMode)
                                {
                                    TargetInvocationException exception2 = exception as TargetInvocationException;
                                    throw (exception2 != null) ? exception2.InnerException : exception;
                                }
                            }
                            break;

                        case PathMemberKind.Event:
                            {
                                EventInfo memberInfo = eventArgs.MemberInfo as EventInfo;
                                DependencyProperty dependencyProperty = DependencyProperty.FromName(memberInfo.Name, value.GetType());
                                if ((dependencyProperty != null) && (value is DependencyObject))
                                {
                                    if ((value as DependencyObject).IsBindingSet(dependencyProperty))
                                    {
                                        value = (value as DependencyObject).GetBinding(dependencyProperty);
                                    }
                                    else
                                    {
                                        value = (value as DependencyObject).GetHandler(dependencyProperty);
                                    }
                                }
                                break;
                            }

                        case PathMemberKind.Property:
                            if ((eventArgs.MemberInfo as PropertyInfo).CanRead)
                            {
                                DependencyProperty property2 = DependencyProperty.FromName(eventArgs.MemberInfo.Name, value.GetType());
                                if (((property2 != null) && (value is DependencyObject)) && (value as DependencyObject).IsBindingSet(property2))
                                {
                                    value = (value as DependencyObject).GetBinding(property2);
                                }
                                else
                                {
                                    try
                                    {
                                        value = (eventArgs.MemberInfo as PropertyInfo).GetValue(value, null);
                                    }
                                    catch (Exception exception3)
                                    {
                                        value = null;
                                        eventArgs.Action = PathWalkAction.Cancel;
                                        if (!refActivity.DesignMode)
                                        {
                                            TargetInvocationException exception4 = exception3 as TargetInvocationException;
                                            throw (exception4 != null) ? exception4.InnerException : exception3;
                                        }
                                    }
                                }
                                break;
                            }
                            eventArgs.Action = PathWalkAction.Cancel;
                            return;

                        case PathMemberKind.IndexedProperty:
                        case PathMemberKind.Index:
                            try
                            {
                                value = (eventArgs.MemberInfo as PropertyInfo).GetValue(value, BindingFlags.GetProperty, null, eventArgs.IndexParameters, CultureInfo.InvariantCulture);
                            }
                            catch (Exception exception5)
                            {
                                value = null;
                                eventArgs.Action = PathWalkAction.Cancel;
                                if (!refActivity.DesignMode)
                                {
                                    TargetInvocationException exception6 = exception5 as TargetInvocationException;
                                    throw (exception6 != null) ? exception6.InnerException : exception5;
                                }
                            }
                            break;
                        }
                        if (((value is ActivityBind) && !eventArgs.LastMemberInThePath) && (GetMemberType(eventArgs.MemberInfo) != typeof(ActivityBind)))
                        {
                            while (value is ActivityBind)
                            {
                                ActivityBind bind = value as ActivityBind;
                                if (recursionContext.Contains(refActivity, bind))
                                {
                                    throw new InvalidOperationException(SR.GetString("Bind_ActivityDataSourceRecursionDetected"));
                                }
                                recursionContext.Add(refActivity, bind);
                                value = bind.GetRuntimeValue(refActivity);
                            }
                        }
                    }
                })
            }.TryWalkPropertyPath(refActivity.GetType(), path))
            {
                return(value);
            }
            return(null);
        }
Example #7
0
        public bool WalkProperties(Activity activity, object obj)
        {
            Activity activity2 = obj as Activity;

            foreach (PropertyInfo info in obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (((info.GetIndexParameters() == null) || (info.GetIndexParameters().Length <= 0)) && (GetSerializationVisibility(info) != DesignerSerializationVisibility.Hidden))
                {
                    object             currentValue       = null;
                    DependencyProperty dependencyProperty = DependencyProperty.FromName(info.Name, obj.GetType());
                    if ((dependencyProperty != null) && (activity2 != null))
                    {
                        if (activity2.IsBindingSet(dependencyProperty))
                        {
                            currentValue = activity2.GetBinding(dependencyProperty);
                        }
                        else
                        {
                            currentValue = activity2.GetValue(dependencyProperty);
                        }
                    }
                    else
                    {
                        try
                        {
                            currentValue = info.CanRead ? info.GetValue(obj, null) : null;
                        }
                        catch
                        {
                        }
                    }
                    if (this.FoundProperty != null)
                    {
                        WalkerEventArgs eventArgs = new WalkerEventArgs(activity, currentValue, info, obj);
                        this.FoundProperty(this, eventArgs);
                        if (eventArgs.Action == WalkerAction.Skip)
                        {
                            continue;
                        }
                        if (eventArgs.Action == WalkerAction.Abort)
                        {
                            return(false);
                        }
                    }
                    if (currentValue is IList)
                    {
                        foreach (object obj3 in (IList)currentValue)
                        {
                            if (this.FoundProperty != null)
                            {
                                WalkerEventArgs args2 = new WalkerEventArgs(activity, obj3, null, currentValue);
                                this.FoundProperty(this, args2);
                                if (args2.Action == WalkerAction.Skip)
                                {
                                    continue;
                                }
                                if (args2.Action == WalkerAction.Abort)
                                {
                                    return(false);
                                }
                            }
                            if (((obj3 != null) && IsBrowsableType(obj3.GetType())) && !this.WalkProperties(activity, obj3))
                            {
                                return(false);
                            }
                        }
                    }
                    else if (((currentValue != null) && IsBrowsableType(currentValue.GetType())) && !this.WalkProperties(activity, currentValue))
                    {
                        return(false);
                    }
                }
            }
            return(true);
        }