예제 #1
0
        public ProxyObject(ProxyObject parentProxy, IProxyPropertyInfo proxyPropertyInfo, object key)
        {
            this.parentProxy       = parentProxy;
            this.proxyPropertyInfo = proxyPropertyInfo;
            this._key = key;

            if (this.parentProxy == null || this.proxyPropertyInfo == null)
            {
                throw new ArgumentNullException();
            }

            this.parentProxy.ValueChanged += OnParent_ValueChanged;
            var parent = this.parentProxy.Value;

            if (parent != null && parent is INotifyPropertyChanged)
            {
                ((INotifyPropertyChanged)parent).PropertyChanged += OnParent_PropertyChanged;
            }

            if (this._key != null && parent != null && parent is INotifyCollectionChanged)
            {
                ((INotifyCollectionChanged)parent).CollectionChanged += OnParent_CollectionChanged;
            }

            this.type = proxyPropertyInfo.PropertyType;
#if NETFX_CORE
            this.hasProperty = !this.type.GetTypeInfo().IsValueType;
#else
            this.hasProperty = !this.type.IsValueType;
#endif
        }
예제 #2
0
        public AbstractPropertyObjectSourceProxy(object source, PropertyInfo propertyInfo) : base(source)
        {
            this.propertyInfo  = propertyInfo;
            this.propertyName  = this.propertyInfo.Name;
            this.proxyProperty = propertyInfo.AsProxy();

            if (this.proxyProperty.IsStatic)
            {
                return;
            }

            if (this.Source == null)
            {
                if (log.IsWarnEnabled)
                {
                    log.Warn("Unable to bind to source as it's null");
                }
                return;
            }

            if (this.Source is INotifyPropertyChanged)
            {
                var sourceNotify = this.Source as INotifyPropertyChanged;
                sourceNotify.PropertyChanged += OnPropertyChanged;
            }

            if (this.Source is ValueType || !(this.Source is INotifyPropertyChanged))
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("The \"{0}\" type can't be listened", this.Source.GetType().Name);
                }
            }
        }
예제 #3
0
        public void Remove(IProxyPropertyInfo info)
        {
            if (info == null || info.PropertyInfo == null)
            {
                return;
            }

            properties.Remove(info.PropertyInfo);
        }
예제 #4
0
        public void Add(IProxyPropertyInfo info)
        {
            if (info == null || info.PropertyInfo == null)
            {
                return;
            }

            properties[info.PropertyInfo] = info;
        }
예제 #5
0
        public void SetProperty <T>(string name, T value)
        {
            IProxyPropertyInfo proxyPropertyInfo = this.ProxyType.GetProperty(name);

            if (proxyPropertyInfo == null)
            {
                throw new InvalidOperationException("Property not found");
            }

            proxyPropertyInfo.SetValue(this.Value, value);
        }
예제 #6
0
        public void Register(IProxyPropertyInfo info)
        {
            if (info == null)
            {
                return;
            }

            ProxyType proxyType = GetProxyType(info.DeclaringType);

            proxyType.Add(info);
        }
 public VisualElementPropertyProxy(object target, IProxyPropertyInfo propertyInfo) : base(target, propertyInfo)
 {
     //不能所有的属性都自动绑定,可能绑定的其他值,与事件不匹配的值
     if (target is INotifyValueChanged <TValue> )
     {
         this.notifyValueChanged = (INotifyValueChanged <TValue>)target;
     }
     else
     {
         notifyValueChanged = null;
     }
 }
예제 #8
0
        public ProxyCollection(ProxyObject parentProxy, IProxyPropertyInfo proxyPropertyInfo) : base(parentProxy, proxyPropertyInfo)
        {
            if (!typeof(T).Equals(proxyPropertyInfo.PropertyType))
            {
                throw new ArgumentException();
            }

            this._proxyItemPropertyInfo = this.ProxyType.GetProperty("Item");
            if (this._proxyItemPropertyInfo == null)
            {
                throw new InvalidOperationException("Item not found");
            }
        }
예제 #9
0
        public T GetProperty <T>(string name)
        {
            IProxyPropertyInfo proxyPropertyInfo = this.ProxyType.GetProperty(name);

            if (proxyPropertyInfo == null)
            {
                throw new InvalidOperationException("Property not found");
            }

            object value = proxyPropertyInfo.GetValue(this.Value);

            return((T)typeof(T).ToSafe(value));
        }
예제 #10
0
        protected virtual ITargetProxy CreateUnityPropertyProxy(object target, IProxyPropertyInfo propertyInfo, UnityEventBase updateTrigger)
        {
            Type type = propertyInfo.ValueType;

#if NETFX_CORE
            TypeCode typeCode = WinRTLegacy.TypeExtensions.GetTypeCode(type);
#else
            TypeCode typeCode = Type.GetTypeCode(type);
#endif

            switch (typeCode)
            {
            case TypeCode.String: return(new UnityPropertyProxy <string>(target, propertyInfo, (UnityEvent <string>)updateTrigger));

            case TypeCode.Boolean: return(new UnityPropertyProxy <bool>(target, propertyInfo, (UnityEvent <bool>)updateTrigger));

            case TypeCode.SByte: return(new UnityPropertyProxy <sbyte>(target, propertyInfo, (UnityEvent <sbyte>)updateTrigger));

            case TypeCode.Byte: return(new UnityPropertyProxy <byte>(target, propertyInfo, (UnityEvent <byte>)updateTrigger));

            case TypeCode.Int16: return(new UnityPropertyProxy <short>(target, propertyInfo, (UnityEvent <short>)updateTrigger));

            case TypeCode.UInt16: return(new UnityPropertyProxy <ushort>(target, propertyInfo, (UnityEvent <ushort>)updateTrigger));

            case TypeCode.Int32: return(new UnityPropertyProxy <int>(target, propertyInfo, (UnityEvent <int>)updateTrigger));

            case TypeCode.UInt32: return(new UnityPropertyProxy <uint>(target, propertyInfo, (UnityEvent <uint>)updateTrigger));

            case TypeCode.Int64: return(new UnityPropertyProxy <long>(target, propertyInfo, (UnityEvent <long>)updateTrigger));

            case TypeCode.UInt64: return(new UnityPropertyProxy <ulong>(target, propertyInfo, (UnityEvent <ulong>)updateTrigger));

            case TypeCode.Char: return(new UnityPropertyProxy <char>(target, propertyInfo, (UnityEvent <char>)updateTrigger));

            case TypeCode.Single: return(new UnityPropertyProxy <float>(target, propertyInfo, (UnityEvent <float>)updateTrigger));

            case TypeCode.Double: return(new UnityPropertyProxy <double>(target, propertyInfo, (UnityEvent <double>)updateTrigger));

            case TypeCode.Decimal: return(new UnityPropertyProxy <decimal>(target, propertyInfo, (UnityEvent <decimal>)updateTrigger));

            case TypeCode.DateTime: return(new UnityPropertyProxy <DateTime>(target, propertyInfo, (UnityEvent <DateTime>)updateTrigger));

            case TypeCode.Object:
            default:
#if UNITY_IOS
                throw new NotSupportedException();
#else
                return((ITargetProxy)Activator.CreateInstance(typeof(UnityPropertyProxy <>).MakeGenericType(propertyInfo.ValueType), target, propertyInfo, updateTrigger));
#endif
            }
        }
        protected virtual ITargetProxy CreateUnityPropertyProxy(object target, IProxyPropertyInfo propertyInfo, UnityEventBase updateTrigger)
        {
            Type     type     = propertyInfo.ValueType;
            TypeCode typeCode = propertyInfo.ValueTypeCode;

            switch (typeCode)
            {
            case TypeCode.String: return(new UnityPropertyProxy <string>(target, propertyInfo, (UnityEvent <string>)updateTrigger));

            case TypeCode.Boolean: return(new UnityPropertyProxy <bool>(target, propertyInfo, (UnityEvent <bool>)updateTrigger));

            case TypeCode.SByte: return(new UnityPropertyProxy <sbyte>(target, propertyInfo, (UnityEvent <sbyte>)updateTrigger));

            case TypeCode.Byte: return(new UnityPropertyProxy <byte>(target, propertyInfo, (UnityEvent <byte>)updateTrigger));

            case TypeCode.Int16: return(new UnityPropertyProxy <short>(target, propertyInfo, (UnityEvent <short>)updateTrigger));

            case TypeCode.UInt16: return(new UnityPropertyProxy <ushort>(target, propertyInfo, (UnityEvent <ushort>)updateTrigger));

            case TypeCode.Int32: return(new UnityPropertyProxy <int>(target, propertyInfo, (UnityEvent <int>)updateTrigger));

            case TypeCode.UInt32: return(new UnityPropertyProxy <uint>(target, propertyInfo, (UnityEvent <uint>)updateTrigger));

            case TypeCode.Int64: return(new UnityPropertyProxy <long>(target, propertyInfo, (UnityEvent <long>)updateTrigger));

            case TypeCode.UInt64: return(new UnityPropertyProxy <ulong>(target, propertyInfo, (UnityEvent <ulong>)updateTrigger));

            case TypeCode.Char: return(new UnityPropertyProxy <char>(target, propertyInfo, (UnityEvent <char>)updateTrigger));

            case TypeCode.Single: return(new UnityPropertyProxy <float>(target, propertyInfo, (UnityEvent <float>)updateTrigger));

            case TypeCode.Double: return(new UnityPropertyProxy <double>(target, propertyInfo, (UnityEvent <double>)updateTrigger));

            case TypeCode.Decimal: return(new UnityPropertyProxy <decimal>(target, propertyInfo, (UnityEvent <decimal>)updateTrigger));

            case TypeCode.DateTime: return(new UnityPropertyProxy <DateTime>(target, propertyInfo, (UnityEvent <DateTime>)updateTrigger));

            case TypeCode.Object:
            default:
            {
                try
                {
                    return((ITargetProxy)Activator.CreateInstance(typeof(UnityPropertyProxy <>).MakeGenericType(propertyInfo.ValueType), target, propertyInfo, updateTrigger));
                }
                catch (Exception e)
                {
                    throw new NotSupportedException("", e);
                }
            }
            }
        }
예제 #12
0
        protected IProxyPropertyInfo CreateProxyPropertyInfo(PropertyInfo propertyInfo)
        {
            IProxyPropertyInfo info = null;

#if UNITY_IOS
            info = new ProxyPropertyInfo(propertyInfo);
#else
            try
            {
                Type type = propertyInfo.DeclaringType;
                if (propertyInfo.IsStatic())
                {
                    ParameterInfo[] parameters = propertyInfo.GetIndexParameters();
                    if (parameters != null && parameters.Length > 0)
                    {
                        throw new NotSupportedException();
                    }

                    info = (IProxyPropertyInfo)Activator.CreateInstance(typeof(StaticProxyPropertyInfo <,>).MakeGenericType(type, propertyInfo.PropertyType), propertyInfo);
                }
                else
                {
                    ParameterInfo[] parameters = propertyInfo.GetIndexParameters();
                    if (parameters != null && parameters.Length == 1)
                    {
                        throw new NotSupportedException();
                    }

                    info = (IProxyPropertyInfo)Activator.CreateInstance(typeof(ProxyPropertyInfo <,>).MakeGenericType(type, propertyInfo.PropertyType), propertyInfo);
                }
            }
            catch (NotSupportedException e)
            {
                throw e;
            }
            catch (Exception)
            {
                info = new ProxyPropertyInfo(propertyInfo);
            }
#endif
            if (info != null)
            {
                this.properties.Add(info.Name, info);
            }
            return(info);
        }
예제 #13
0
        public PropertyNodeProxy(object source, IProxyPropertyInfo propertyInfo) : base(source)
        {
            this.propertyInfo = propertyInfo;

            if (this.source == null)
            {
                return;
            }

            if (this.source is INotifyPropertyChanged)
            {
                var sourceNotify = this.source as INotifyPropertyChanged;
                sourceNotify.PropertyChanged += OnPropertyChanged;
            }
            else
            {
                if (log.IsWarnEnabled)
                {
                    log.WarnFormat("The type {0} does not inherit the INotifyPropertyChanged interface and does not support the PropertyChanged event.", propertyInfo.DeclaringType.Name);
                }
            }
        }
 public UnityPropertyProxy(object target, IProxyPropertyInfo propertyInfo, UnityEvent <TValue> unityEvent) : base(target, propertyInfo)
 {
     this.unityEvent = unityEvent;
 }
예제 #15
0
        protected virtual ISourceProxy CreateProxy(object source, IPathNode node)
        {
            IProxyType proxyType = source.GetType().AsProxy();

            if (node is IndexedNode)
            {
                var itemInfo = proxyType.GetItem();
                if (itemInfo == null)
                {
                    return(null);
                }

                var intIndexedNode = node as IntegerIndexedNode;
                if (intIndexedNode != null)
                {
                    return(new IntItemNodeProxy((ICollection)source, intIndexedNode.Value, itemInfo));
                }

                var stringIndexedNode = node as StringIndexedNode;
                if (stringIndexedNode != null)
                {
                    return(new StringItemNodeProxy((ICollection)source, stringIndexedNode.Value, itemInfo));
                }

                return(null);
            }

            var memberNode = node as MemberNode;

            if (memberNode == null)
            {
                return(null);
            }

            var memberInfo = memberNode.MemberInfo;

            if (memberInfo == null)
            {
                memberInfo = source.GetType().FindFirstMemberInfo(memberNode.Name);
            }

            if (memberInfo == null || memberInfo.IsStatic())
            {
                return(null);
            }

            var propertyInfo = memberInfo as PropertyInfo;

            if (propertyInfo != null)
            {
                IProxyPropertyInfo proxyPropertyInfo = propertyInfo.AsProxy();
                var valueType = proxyPropertyInfo.ValueType;
                if (typeof(IObservableProperty).IsAssignableFrom(valueType))
                {
                    object observableValue = proxyPropertyInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ObservableNodeProxy(source, (IObservableProperty)observableValue));
                }
                // else if (typeof(IInteractionRequest).IsAssignableFrom(valueType))
                // {
                // object request = proxyPropertyInfo.GetValue(source);
                // if (request == null)
                // return null;

                // return new InteractionNodeProxy(source, (IInteractionRequest)request);
                // }
                else
                {
                    return(new PropertyNodeProxy(source, proxyPropertyInfo));
                }
            }

            var fieldInfo = memberInfo as FieldInfo;

            if (fieldInfo != null)
            {
                IProxyFieldInfo proxyFieldInfo = fieldInfo.AsProxy();
                var             valueType      = proxyFieldInfo.ValueType;
                if (typeof(IObservableProperty).IsAssignableFrom(valueType))
                {
                    object observableValue = proxyFieldInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ObservableNodeProxy(source, (IObservableProperty)observableValue));
                }
                // else if (typeof(IInteractionRequest).IsAssignableFrom(valueType))
                // {
                // object request = proxyFieldInfo.GetValue(source);
                // if (request == null)
                // return null;

                // return new InteractionNodeProxy(source, (IInteractionRequest)request);
                // }
                else
                {
                    return(new FieldNodeProxy(source, proxyFieldInfo));
                }
            }

            var methodInfo = memberInfo as MethodInfo;

            if (methodInfo != null && methodInfo.ReturnType.Equals(typeof(void)))
            {
                return(new MethodNodeProxy(source, methodInfo.AsProxy()));
            }

            var eventInfo = memberInfo as EventInfo;

            if (eventInfo != null)
            {
                return(new EventNodeProxy(source, eventInfo.AsProxy()));
            }

            return(null);
        }
예제 #16
0
        public ITargetProxy CreateProxy(object target, BindingDescription description)
        {
            IProxyType       type       = target.GetType().AsProxy();
            IProxyMemberInfo memberInfo = type.GetMember(description.TargetName);

            if (memberInfo == null)
            {
                memberInfo = type.GetMember(description.TargetName, BindingFlags.Instance | BindingFlags.NonPublic);
            }

            if (memberInfo == null)
            {
                throw new MissingMemberException(type.Type.FullName, description.TargetName);
            }

            EventListener updateTrigger = null;

            if (!string.IsNullOrEmpty(description.UpdateTrigger))
            {
                IProxyPropertyInfo updateTriggerPropertyInfo = type.GetProperty(description.UpdateTrigger);
                IProxyFieldInfo    updateTriggerFieldInfo    = updateTriggerPropertyInfo == null?type.GetField(description.UpdateTrigger) : null;

                if (updateTriggerPropertyInfo != null)
                {
                    updateTrigger = updateTriggerPropertyInfo.GetValue(target) as EventListener;
                }

                if (updateTriggerFieldInfo != null)
                {
                    updateTrigger = updateTriggerFieldInfo.GetValue(target) as EventListener;
                }

                if (updateTriggerPropertyInfo == null && updateTriggerFieldInfo == null)
                {
                    throw new MissingMemberException(type.Type.FullName, description.UpdateTrigger);
                }

                //Other Property Type
                if (updateTrigger == null) /* by UniversalTargetProxyFactory */
                {
                    return(null);
                }
            }

            var propertyInfo = memberInfo as IProxyPropertyInfo;

            if (propertyInfo != null)
            {
                if (typeof(IObservableProperty).IsAssignableFrom(propertyInfo.ValueType))
                {
                    return(null);
                }

                if (typeof(EventListener).IsAssignableFrom(propertyInfo.ValueType))
                {
                    //Event Type
                    object listener = propertyInfo.GetValue(target);
                    if (listener == null)
                    {
                        throw new NullReferenceException(propertyInfo.Name);
                    }

                    return(new FairyEventProxy(target, (EventListener)listener));
                }

                //Other Property Type
                if (updateTrigger == null)/* by UniversalTargetProxyFactory */
                {
                    return(null);
                }

                return(new FairyPropertyProxy(target, propertyInfo, updateTrigger));
            }

            var fieldInfo = memberInfo as IProxyFieldInfo;

            if (fieldInfo != null)
            {
                if (typeof(IObservableProperty).IsAssignableFrom(fieldInfo.ValueType))
                {
                    return(null);
                }

                if (typeof(EventListener).IsAssignableFrom(fieldInfo.ValueType))
                {
                    //Event Type
                    object listener = fieldInfo.GetValue(target);
                    if (listener == null)
                    {
                        throw new NullReferenceException(fieldInfo.Name);
                    }

                    return(new FairyEventProxy(target, (EventListener)listener));
                }

                //Other Property Type
                if (updateTrigger == null)/* by UniversalTargetProxyFactory */
                {
                    return(null);
                }

                return(new FairyFieldProxy(target, fieldInfo, updateTrigger));
            }

            return(null);
        }
        public override void SetValue(object value)
        {
            var target = this.Target;

            if (target == null)
            {
                return;
            }

            if (this.command != null)
            {
                UnbindCommand(this.command);
                this.command = null;
            }

            if (this.invoker != null)
            {
                this.invoker = null;
            }

            if (this.handler != null)
            {
                this.handler = null;
            }

            if (value == null)
            {
                return;
            }

            //Bind Command
            ICommand command = value as ICommand;

            if (command != null)
            {
                if (this.interactable == null)
                {
                    var interactablePropertyInfo = target.GetType().GetProperty("interactable");
                    if (interactablePropertyInfo != null)
                    {
                        this.interactable = interactablePropertyInfo.AsProxy();
                    }
                }

                this.command = command;
                BindCommand(this.command);
                UpdateTargetInteractable();
                return;
            }

            //Bind Method
            IProxyInvoker proxyInvoker = value as IProxyInvoker;

            if (proxyInvoker != null)
            {
                if (this.IsValid(proxyInvoker))
                {
                    this.invoker = proxyInvoker;
                    return;
                }

                throw new ArgumentException("Bind method failed.the parameter types do not match.");
            }

            //Bind Delegate
            Delegate handler = value as Delegate;

            if (handler != null)
            {
                if (this.IsValid(handler))
                {
                    this.handler = handler;
                    return;
                }

                throw new ArgumentException("Bind method failed.the parameter types do not match.");
            }

            //Bind Script Function
            IInvoker invoker = value as IInvoker;

            if (invoker != null)
            {
                this.invoker = invoker;
            }
        }
예제 #18
0
 public PropertyTargetProxy(object target, PropertyInfo propertyInfo) : base(target)
 {
     this.propertyInfo  = propertyInfo;
     this.proxyProperty = propertyInfo.AsProxy();
 }
예제 #19
0
        protected virtual IObjectSourceProxy CreateChainedProxy(object source, IPathNode node, PathToken nextToken, IObjectSourceProxyFactory factory)
        {
            var indexedNode = node as IndexedNode;

            if (indexedNode != null)
            {
                var itemPropertyInfo = this.FindItemPropertyInfo(source.GetType());
                if (itemPropertyInfo == null)
                {
                    return(null);
                }

                return(new ChainedItemObjectSourceProxy(source, itemPropertyInfo, nextToken, factory, indexedNode.Value));
            }

            var memberNode = node as MemberNode;

            if (memberNode == null)
            {
                return(null);
            }

            var memberInfo = memberNode.MemberInfo;

            if (memberInfo == null)
            {
                memberInfo = source.GetType().FindFirstMemberInfo(memberNode.Name);
            }

            if (memberInfo == null || memberInfo.IsStatic())
            {
                return(null);
            }

            var propertyInfo = memberInfo as PropertyInfo;

            if (propertyInfo != null)
            {
                var propertyType = propertyInfo.PropertyType;

                if (typeof(IObservableProperty).IsAssignableFrom(propertyType))
                {
                    IProxyPropertyInfo proxyPropertyInfo = propertyInfo.AsProxy();
                    object             observableValue   = proxyPropertyInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ChainedObservablePropertyObjectSourceProxy(source, (IObservableProperty)observableValue, nextToken, factory));
                }
                else
                {
                    return(new ChainedPropertyObjectSourceProxy(source, propertyInfo, nextToken, factory));
                }
            }

            var fieldInfo = memberInfo as FieldInfo;

            if (fieldInfo != null)
            {
                var fieldType = fieldInfo.FieldType;

                if (typeof(IObservableProperty).IsAssignableFrom(fieldType))
                {
                    IProxyFieldInfo proxyFieldInfo  = fieldInfo.AsProxy();
                    object          observableValue = proxyFieldInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ChainedObservablePropertyObjectSourceProxy(source, (IObservableProperty)observableValue, nextToken, factory));
                }
                else
                {
                    return(new ChainedFieldObjectSourceProxy(source, fieldInfo, nextToken, factory));
                }
            }
            return(null);
        }
        //private static readonly ILog log = LogManager.GetLogger(typeof(UnityTargetProxyFactory));

        public ITargetProxy CreateProxy(object target, BindingDescription description)
        {
            IProxyType       type       = target.GetType().AsProxy();
            IProxyMemberInfo memberInfo = type.GetMember(description.TargetName);

            if (memberInfo == null)
            {
                memberInfo = type.GetMember(description.TargetName, BindingFlags.Instance | BindingFlags.NonPublic);
            }

            if (memberInfo == null)
            {
                throw new MissingMemberException(type.Type.FullName, description.TargetName);
            }

            UnityEventBase updateTrigger = null;

            if (!string.IsNullOrEmpty(description.UpdateTrigger))
            {
                IProxyPropertyInfo updateTriggerPropertyInfo = type.GetProperty(description.UpdateTrigger);
                IProxyFieldInfo    updateTriggerFieldInfo    = updateTriggerPropertyInfo == null?type.GetField(description.UpdateTrigger) : null;

                if (updateTriggerPropertyInfo != null)
                {
                    updateTrigger = updateTriggerPropertyInfo.GetValue(target) as UnityEventBase;
                }

                if (updateTriggerFieldInfo != null)
                {
                    updateTrigger = updateTriggerFieldInfo.GetValue(target) as UnityEventBase;
                }

                if (updateTriggerPropertyInfo == null && updateTriggerFieldInfo == null)
                {
                    throw new MissingMemberException(type.Type.FullName, description.UpdateTrigger);
                }

                //Other Property Type
                if (updateTrigger == null) /* by UniversalTargetProxyFactory */
                {
                    return(null);
                }
            }

            var propertyInfo = memberInfo as IProxyPropertyInfo;

            if (propertyInfo != null)
            {
                if (typeof(IObservableProperty).IsAssignableFrom(propertyInfo.ValueType))
                {
                    return(null);
                }

                if (typeof(UnityEventBase).IsAssignableFrom(propertyInfo.ValueType))
                {
                    //Event Type
                    object unityEvent = propertyInfo.GetValue(target);
                    Type[] paramTypes = GetUnityEventParametersType(propertyInfo.ValueType);
                    return(CreateUnityEventProxy(target, (UnityEventBase)unityEvent, paramTypes));
                }

                //Other Property Type
                if (updateTrigger == null)/* by UniversalTargetProxyFactory */
                {
                    return(null);
                }

                return(CreateUnityPropertyProxy(target, propertyInfo, updateTrigger));
            }

            var fieldInfo = memberInfo as IProxyFieldInfo;

            if (fieldInfo != null)
            {
                if (typeof(IObservableProperty).IsAssignableFrom(fieldInfo.ValueType))
                {
                    return(null);
                }

                if (typeof(UnityEventBase).IsAssignableFrom(fieldInfo.ValueType))
                {
                    //Event Type
                    object unityEvent = fieldInfo.GetValue(target);
                    Type[] paramTypes = GetUnityEventParametersType(fieldInfo.ValueType);
                    return(CreateUnityEventProxy(target, (UnityEventBase)unityEvent, paramTypes));
                }

                //Other Property Type
                if (updateTrigger == null)/* by UniversalTargetProxyFactory */
                {
                    return(null);
                }

                return(CreateUnityFieldProxy(target, fieldInfo, updateTrigger));
            }

            return(null);
        }
예제 #21
0
        protected virtual IObjectSourceProxy CreateStaticChainedProxy(Type type, IPathNode node, PathToken nextToken, IObjectSourceProxyFactory factory)
        {
            var memberNode = node as MemberNode;

            if (memberNode == null)
            {
                return(null);
            }

            var memberInfo = memberNode.MemberInfo;

            if (memberInfo == null)
            {
                memberInfo = this.FindStaticMemberInfo(type, memberNode.Name);
            }

            if (memberInfo == null)
            {
                return(null);
            }

            var propertyInfo = memberInfo as PropertyInfo;

            if (propertyInfo != null)
            {
                var propertyType = propertyInfo.PropertyType;

                if (typeof(IObservableProperty).IsAssignableFrom(propertyType))
                {
                    IProxyPropertyInfo proxyPropertyInfo = propertyInfo.AsProxy();
                    object             observableValue   = proxyPropertyInfo.GetValue(null);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ChainedObservablePropertyObjectSourceProxy((IObservableProperty)observableValue, nextToken, factory));
                }
                else
                {
                    return(new ChainedPropertyObjectSourceProxy(propertyInfo, nextToken, factory));
                }
            }

            var fieldInfo = memberInfo as FieldInfo;

            if (fieldInfo != null)
            {
                var fieldType = fieldInfo.FieldType;

                if (typeof(IObservableProperty).IsAssignableFrom(fieldType))
                {
                    IProxyFieldInfo proxyFieldInfo  = fieldInfo.AsProxy();
                    object          observableValue = proxyFieldInfo.GetValue(null);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ChainedObservablePropertyObjectSourceProxy((IObservableProperty)observableValue, nextToken, factory));
                }
                else
                {
                    return(new ChainedFieldObjectSourceProxy(fieldInfo, nextToken, factory));
                }
            }
            return(null);
        }
예제 #22
0
        protected virtual IObjectSourceProxy CreateStaticLeafProxy(Type type, IPathNode node)
        {
            var memberNode = node as MemberNode;

            if (memberNode == null)
            {
                return(null);
            }

            var memberInfo = memberNode.MemberInfo;

            if (memberInfo == null)
            {
                memberInfo = this.FindStaticMemberInfo(type, memberNode.Name);
            }

            if (memberInfo == null)
            {
                return(null);
            }

            var propertyInfo = memberInfo as PropertyInfo;

            if (propertyInfo != null)
            {
                var propertyType = propertyInfo.PropertyType;

                if (typeof(IObservableProperty).IsAssignableFrom(propertyType))
                {
                    IProxyPropertyInfo proxyPropertyInfo = propertyInfo.AsProxy();
                    object             observableValue   = proxyPropertyInfo.GetValue(null);
                    if (observableValue == null)
                    {
                        throw new ArgumentNullException();
                    }

                    return(new ObservablePropertyObjectSourceProxy((IObservableProperty)observableValue));
                }
                else
                {
                    return(new LeafPropertyObjectSourceProxy(null, propertyInfo));
                }
            }

            var fieldInfo = memberInfo as FieldInfo;

            if (fieldInfo != null)
            {
                var fieldType = fieldInfo.FieldType;

                if (typeof(IObservableProperty).IsAssignableFrom(fieldType))
                {
                    IProxyFieldInfo proxyFieldInfo  = fieldInfo.AsProxy();
                    object          observableValue = proxyFieldInfo.GetValue(null);
                    if (observableValue == null)
                    {
                        throw new ArgumentNullException();
                    }

                    return(new ObservablePropertyObjectSourceProxy((IObservableProperty)observableValue));
                }
                else
                {
                    return(new LeafFieldObjectSourceProxy(fieldInfo));
                }
            }

            var methodInfo = memberInfo as MethodInfo;

            if (methodInfo != null && methodInfo.ReturnType.Equals(typeof(void)))
            {
                return(new VoidMethodObjectSourceProxy(methodInfo));
            }

            var eventInfo = memberInfo as EventInfo;

            if (eventInfo != null)
            {
                return(new EventObjectSourceProxy(eventInfo));
            }

            return(null);
        }
예제 #23
0
 public ProxyObject(ProxyObject parentProxy, IProxyPropertyInfo proxyPropertyInfo) : this(parentProxy, proxyPropertyInfo, null)
 {
 }
예제 #24
0
        protected virtual IObjectSourceProxy CreateLeafProxy(object source, IPathNode node)
        {
            var indexedNode = node as IndexedNode;

            if (indexedNode != null)
            {
                var itemPropertyInfo = this.FindItemPropertyInfo(source.GetType());
                if (itemPropertyInfo == null)
                {
                    return(null);
                }

                return(new LeafItemObjectSourceProxy(source, itemPropertyInfo, indexedNode.Value));
            }

            var memberNode = node as MemberNode;

            if (memberNode == null)
            {
                return(null);
            }

            var memberInfo = memberNode.MemberInfo;

            if (memberInfo == null)
            {
                memberInfo = source.GetType().FindFirstMemberInfo(memberNode.Name);
            }

            if (memberInfo == null || memberInfo.IsStatic())
            {
                return(null);
            }

            var propertyInfo = memberInfo as PropertyInfo;

            if (propertyInfo != null)
            {
                var propertyType = propertyInfo.PropertyType;

                if (typeof(IObservableProperty).IsAssignableFrom(propertyType))
                {
                    IProxyPropertyInfo proxyPropertyInfo = propertyInfo.AsProxy();
                    object             observableValue   = proxyPropertyInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ObservablePropertyObjectSourceProxy(source, (IObservableProperty)observableValue));
                }
                else
                {
                    return(new LeafPropertyObjectSourceProxy(source, propertyInfo));
                }
            }

            var fieldInfo = memberInfo as FieldInfo;

            if (fieldInfo != null)
            {
                var fieldType = fieldInfo.FieldType;

                if (typeof(IObservableProperty).IsAssignableFrom(fieldType))
                {
                    IProxyFieldInfo proxyFieldInfo  = fieldInfo.AsProxy();
                    object          observableValue = proxyFieldInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ObservablePropertyObjectSourceProxy(source, (IObservableProperty)observableValue));
                }
                else
                {
                    return(new LeafFieldObjectSourceProxy(source, fieldInfo));
                }
            }

            var methodInfo = memberInfo as MethodInfo;

            if (methodInfo != null && methodInfo.ReturnType.Equals(typeof(void)))
            {
                return(new VoidMethodObjectSourceProxy(source, methodInfo));
            }

            var eventInfo = memberInfo as EventInfo;

            if (eventInfo != null)
            {
                return(new EventObjectSourceProxy(source, eventInfo));
            }

            return(null);
        }
        protected virtual ITargetProxy CreateVisualElementPropertyProxy(object target, IProxyPropertyInfo propertyInfo)
        {
            Type type = propertyInfo.ValueType;

#if NETFX_CORE
            TypeCode typeCode = WinRTLegacy.TypeExtensions.GetTypeCode(type);
#else
            TypeCode typeCode = Type.GetTypeCode(type);
#endif

            switch (typeCode)
            {
            case TypeCode.String: return(new VisualElementPropertyProxy <string>(target, propertyInfo));

            case TypeCode.Boolean: return(new VisualElementPropertyProxy <bool>(target, propertyInfo));

            case TypeCode.SByte: return(new VisualElementPropertyProxy <sbyte>(target, propertyInfo));

            case TypeCode.Byte: return(new VisualElementPropertyProxy <byte>(target, propertyInfo));

            case TypeCode.Int16: return(new VisualElementPropertyProxy <short>(target, propertyInfo));

            case TypeCode.UInt16: return(new VisualElementPropertyProxy <ushort>(target, propertyInfo));

            case TypeCode.Int32: return(new VisualElementPropertyProxy <int>(target, propertyInfo));

            case TypeCode.UInt32: return(new VisualElementPropertyProxy <uint>(target, propertyInfo));

            case TypeCode.Int64: return(new VisualElementPropertyProxy <long>(target, propertyInfo));

            case TypeCode.UInt64: return(new VisualElementPropertyProxy <ulong>(target, propertyInfo));

            case TypeCode.Char: return(new VisualElementPropertyProxy <char>(target, propertyInfo));

            case TypeCode.Single: return(new VisualElementPropertyProxy <float>(target, propertyInfo));

            case TypeCode.Double: return(new VisualElementPropertyProxy <double>(target, propertyInfo));

            case TypeCode.Decimal: return(new VisualElementPropertyProxy <decimal>(target, propertyInfo));

            case TypeCode.DateTime: return(new VisualElementPropertyProxy <DateTime>(target, propertyInfo));

            case TypeCode.Object:
            default:
            {
                try
                {
                    return((ITargetProxy)Activator.CreateInstance(typeof(VisualElementPropertyProxy <>).MakeGenericType(type), target, propertyInfo));
                }
                catch (Exception e)
                {
                    throw new NotSupportedException("", e);
                }
            }
            }
        }
예제 #26
0
 public PropertyTargetProxy(object target, IProxyPropertyInfo propertyInfo) : base(target)
 {
     this.propertyInfo = propertyInfo;
 }
 public FairyPropertyProxy(object target, IProxyPropertyInfo propertyInfo, EventListener listener) : base(target, propertyInfo)
 {
     this.listener = listener;
 }
        protected virtual ISourceProxy CreateProxy(object source, IPathNode node)
        {
            IProxyType proxyType = source.GetType().AsProxy();

            if (node is IndexedNode)
            {
                if (!(source is ICollection))
                {
                    throw new ProxyException("Type \"{0}\" is not a collection and cannot be accessed by index \"{1}\".", proxyType.Type.Name, node.ToString());
                }

                var itemInfo = proxyType.GetItem();
                if (itemInfo == null)
                {
                    throw new MissingMemberException(proxyType.Type.FullName, "Item");
                }

                var intIndexedNode = node as IntegerIndexedNode;
                if (intIndexedNode != null)
                {
                    return(new IntItemNodeProxy((ICollection)source, intIndexedNode.Value, itemInfo));
                }

                var stringIndexedNode = node as StringIndexedNode;
                if (stringIndexedNode != null)
                {
                    return(new StringItemNodeProxy((ICollection)source, stringIndexedNode.Value, itemInfo));
                }

                return(null);
            }

            var memberNode = node as MemberNode;

            if (memberNode == null)
            {
                return(null);
            }

            var memberInfo = memberNode.MemberInfo;

            if (memberInfo == null)
            {
                memberInfo = source.GetType().FindFirstMemberInfo(memberNode.Name);
            }

            if (memberInfo == null || memberInfo.IsStatic())
            {
                throw new MissingMemberException(proxyType.Type.FullName, memberNode.Name);
            }

            var propertyInfo = memberInfo as PropertyInfo;

            if (propertyInfo != null)
            {
                IProxyPropertyInfo proxyPropertyInfo = propertyInfo.AsProxy();
                var valueType = proxyPropertyInfo.ValueType;
                if (typeof(IObservableProperty).IsAssignableFrom(valueType))
                {
                    object observableValue = proxyPropertyInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ObservableNodeProxy(source, (IObservableProperty)observableValue));
                }
                else if (typeof(IInteractionRequest).IsAssignableFrom(valueType))
                {
                    object request = proxyPropertyInfo.GetValue(source);
                    if (request == null)
                    {
                        return(null);
                    }

                    return(new InteractionNodeProxy(source, (IInteractionRequest)request));
                }
                else
                {
                    return(new PropertyNodeProxy(source, proxyPropertyInfo));
                }
            }

            var fieldInfo = memberInfo as FieldInfo;

            if (fieldInfo != null)
            {
                IProxyFieldInfo proxyFieldInfo = fieldInfo.AsProxy();
                var             valueType      = proxyFieldInfo.ValueType;
                if (typeof(IObservableProperty).IsAssignableFrom(valueType))
                {
                    object observableValue = proxyFieldInfo.GetValue(source);
                    if (observableValue == null)
                    {
                        return(null);
                    }

                    return(new ObservableNodeProxy(source, (IObservableProperty)observableValue));
                }
                else if (typeof(IInteractionRequest).IsAssignableFrom(valueType))
                {
                    object request = proxyFieldInfo.GetValue(source);
                    if (request == null)
                    {
                        return(null);
                    }

                    return(new InteractionNodeProxy(source, (IInteractionRequest)request));
                }
                else
                {
                    return(new FieldNodeProxy(source, proxyFieldInfo));
                }
            }

            var methodInfo = memberInfo as MethodInfo;

            if (methodInfo != null && methodInfo.ReturnType.Equals(typeof(void)))
            {
                return(new MethodNodeProxy(source, methodInfo.AsProxy()));
            }

            var eventInfo = memberInfo as EventInfo;

            if (eventInfo != null)
            {
                return(new EventNodeProxy(source, eventInfo.AsProxy()));
            }

            return(null);
        }
예제 #29
0
 public PropertyNodeProxy(IProxyPropertyInfo propertyInfo) : this(null, propertyInfo)
 {
 }