Exemple #1
0
        protected virtual ITargetProxy CreateUnityFieldProxy(object target, IProxyFieldInfo fieldInfo, UnityEventBase updateTrigger)
        {
            Type type = fieldInfo.ValueType;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            case TypeCode.Object:
            default:
            {
                try
                {
                    return((ITargetProxy)Activator.CreateInstance(typeof(UnityFieldProxy <>).MakeGenericType(fieldInfo.ValueType), target, fieldInfo, updateTrigger));
                }
                catch (Exception e)
                {
                    throw new NotSupportedException("", e);
                }
            }
            }
        }
Exemple #3
0
        protected IProxyFieldInfo CreateProxyFieldInfo(FieldInfo fieldInfo)
        {
            IProxyFieldInfo info = null;

            try
            {
                info = (IProxyFieldInfo)Activator.CreateInstance(typeof(ProxyFieldInfo <,>).MakeGenericType(fieldInfo.DeclaringType, fieldInfo.FieldType), fieldInfo);
            }
            catch (Exception)
            {
                info = new ProxyFieldInfo(fieldInfo);
            }
            if (info != null)
            {
                this.fields.Add(info.Name, info);
            }
            return(info);
        }
        public AbstractFieldObjectSourceProxy(object source, FieldInfo fieldInfo) : base(source)
        {
            this.fieldInfo  = fieldInfo;
            this.proxyField = fieldInfo.AsProxy();

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

            if (this.Source == null)
            {
                if (log.IsWarnEnabled)
                {
                    log.Warn("Unable to bind to source as it's null");
                }
                return;
            }
        }
Exemple #5
0
 public UnityFieldProxy(object target, IProxyFieldInfo fieldInfo, UnityEvent <TValue> unityEvent) : base(target, fieldInfo)
 {
     this.unityEvent = unityEvent;
 }
 public FieldTargetProxy(object target, IProxyFieldInfo fieldInfo) : base(target)
 {
     this.fieldInfo = fieldInfo;
 }
Exemple #7
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);
        }
Exemple #8
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);
        }
Exemple #9
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);
        }
Exemple #10
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);
        }
        //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);
        }
Exemple #12
0
 public FieldNodeProxy(object source, IProxyFieldInfo fieldInfo) : base(source)
 {
     this.fieldInfo = fieldInfo;
 }
 public FairyFieldProxy(object target, IProxyFieldInfo fieldInfo, EventListener listener) : base(target, fieldInfo)
 {
     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);
        }
Exemple #15
0
 public FieldTargetProxy(object target, FieldInfo fieldInfo) : base(target)
 {
     this.fieldInfo  = fieldInfo;
     this.proxyField = fieldInfo.AsProxy();
 }
Exemple #16
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);
        }
Exemple #17
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);
        }
Exemple #18
0
 public FieldNodeProxy(IProxyFieldInfo fieldInfo) : this(null, fieldInfo)
 {
 }