public void Unregister(IProxyMemberInfo memberInfo)
        {
            if (!memberInfo.DeclaringType.Equals(type))
            {
                throw new ArgumentException();
            }

            string name = memberInfo.Name;

            if (memberInfo is IProxyPropertyInfo)
            {
                this.properties.Remove(name);
            }
            else if (memberInfo is IProxyMethodInfo)
            {
                this.RemoveMethodInfo((IProxyMethodInfo)memberInfo);
            }
            else if (memberInfo is IProxyFieldInfo)
            {
                this.fields.Remove(name);
            }
            else if (memberInfo is IProxyEventInfo)
            {
                this.events.Remove(name);
            }
            else if (memberInfo is IProxyItemInfo)
            {
                if (this.itemInfo == memberInfo)
                {
                    this.itemInfo = null;
                }
            }
        }
        public IProxyMemberInfo GetMember(string name, BindingFlags flags)
        {
            if (name.Equals("Item") && typeof(ICollection).IsAssignableFrom(type))
            {
                return(GetItem());
            }

            IProxyMemberInfo info = GetProperty(name, flags);

            if (info != null)
            {
                return(info);
            }

            info = GetMethod(name, flags);
            if (info != null)
            {
                return(info);
            }

            info = GetField(name, flags);
            if (info != null)
            {
                return(info);
            }

            info = GetEvent(name);
            if (info != null)
            {
                return(info);
            }

            return(null);
        }
        public void Unregister(IProxyMemberInfo proxyMemberInfo)
        {
            if (proxyMemberInfo == null)
            {
                return;
            }

            ProxyType proxyType = this.GetType(proxyMemberInfo.DeclaringType);

            proxyType.Unregister(proxyMemberInfo);
        }
Esempio n. 4
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);
        }
Esempio n. 5
0
        //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)
            {
                return(null);
            }

            UnityEventBase updateTrigger = null;

            if (!string.IsNullOrEmpty(description.UpdateTrigger))
            {
                var updateTriggerPropertyInfo = type.GetProperty(description.UpdateTrigger);
                if (updateTriggerPropertyInfo != null)
                {
                    updateTrigger = updateTriggerPropertyInfo.GetValue(target) as UnityEventBase;
                }

                if (updateTriggerPropertyInfo == null)
                {
                    var updateTriggerFieldInfo = type.GetField(description.UpdateTrigger);
                    if (updateTriggerFieldInfo != null)
                    {
                        updateTrigger = updateTriggerFieldInfo.GetValue(target) as UnityEventBase;
                    }
                }
            }

            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);
        }
Esempio n. 6
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)
            {
                return(null);
            }

            var propertyInfo = memberInfo as IProxyPropertyInfo;

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

                    return(new ObservableTargetProxy(target, (IObservableProperty)observableValue));
                }

                // if (typeof(IInteractionAction).IsAssignableFrom(valueType))
                // {
                //     object interactionAction = propertyInfo.GetValue(target);
                //     if (interactionAction == null)
                //         return null;
                //
                //     return new InteractionTargetProxy(target, (IInteractionAction)interactionAction);
                // }

                return(new PropertyTargetProxy(target, propertyInfo));
            }

            var fieldInfo = memberInfo as IProxyFieldInfo;

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

                    return(new ObservableTargetProxy(target, (IObservableProperty)observableValue));
                }

                // if (typeof(IInteractionAction).IsAssignableFrom(valueType))
                // {
                //     object interactionAction = fieldInfo.GetValue(target);
                //     if (interactionAction == null)
                //         return null;
                //
                //     return new InteractionTargetProxy(target, (IInteractionAction)interactionAction);
                // }

                return(new FieldTargetProxy(target, fieldInfo));
            }

            var eventInfo = memberInfo as IProxyEventInfo;

            if (eventInfo != null)
            {
                return(new EventTargetProxy(target, eventInfo));
            }

            var methodInfo = memberInfo as IProxyMethodInfo;

            if (methodInfo != null)
            {
                return(new MethodTargetProxy(target, methodInfo));
            }

            return(null);
        }
        public ITargetProxy CreateProxy(object target, BindingDescription description)
        {
            if (!target.GetType().IsSubclassOfGenericTypeDefinition(typeof(INotifyValueChanged <>)))
            {
                return(null);
            }

            if ("RegisterValueChangedCallback".Equals(description.TargetName))
            {
                return(this.CreateValueChangedEventProxy(target));
            }

            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);
            }

            var propertyInfo = memberInfo as IProxyPropertyInfo;

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

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

                    return(new ClickableEventProxy(target, (Clickable)clickable));
                }

                //Other Property Type
                if (!"RegisterValueChangedCallback".Equals(description.UpdateTrigger))/* by UniversalTargetProxyFactory */
                {
                    return(null);
                }

                return(CreateVisualElementPropertyProxy(target, propertyInfo));
            }

            var fieldInfo = memberInfo as IProxyFieldInfo;

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

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

                    return(new ClickableEventProxy(target, (Clickable)clickable));
                }

                //Other Property Type
                if (!"RegisterValueChangedCallback".Equals(description.UpdateTrigger))/* by UniversalTargetProxyFactory */
                {
                    return(null);
                }

                return(CreateVisualElementFieldProxy(target, fieldInfo));
            }

            return(null);
        }
Esempio n. 8
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);
            }

            var propertyInfo = memberInfo as IProxyPropertyInfo;

            if (propertyInfo != null)
            {
                var valueType = propertyInfo.ValueType;
                if (typeof(IObservableProperty).IsAssignableFrom(valueType))
                {
                    object observableValue = propertyInfo.GetValue(target);
                    if (observableValue == null)
                    {
                        throw new NullReferenceException(string.Format("The \"{0}\" property is null in class \"{1}\".", propertyInfo.Name, propertyInfo.DeclaringType.Name));
                    }

                    return(new ObservableTargetProxy(target, (IObservableProperty)observableValue));
                }

                if (typeof(IInteractionAction).IsAssignableFrom(valueType))
                {
                    object interactionAction = propertyInfo.GetValue(target);
                    if (interactionAction == null)
                    {
                        return(null);
                    }

                    return(new InteractionTargetProxy(target, (IInteractionAction)interactionAction));
                }

                return(new PropertyTargetProxy(target, propertyInfo));
            }

            var fieldInfo = memberInfo as IProxyFieldInfo;

            if (fieldInfo != null)
            {
                var valueType = fieldInfo.ValueType;
                if (typeof(IObservableProperty).IsAssignableFrom(valueType))
                {
                    object observableValue = fieldInfo.GetValue(target);
                    if (observableValue == null)
                    {
                        throw new NullReferenceException(string.Format("The \"{0}\" field is null in class \"{1}\".", fieldInfo.Name, fieldInfo.DeclaringType.Name));
                    }

                    return(new ObservableTargetProxy(target, (IObservableProperty)observableValue));
                }

                if (typeof(IInteractionAction).IsAssignableFrom(valueType))
                {
                    object interactionAction = fieldInfo.GetValue(target);
                    if (interactionAction == null)
                    {
                        return(null);
                    }

                    return(new InteractionTargetProxy(target, (IInteractionAction)interactionAction));
                }

                return(new FieldTargetProxy(target, fieldInfo));
            }

            var eventInfo = memberInfo as IProxyEventInfo;

            if (eventInfo != null)
            {
                return(new EventTargetProxy(target, eventInfo));
            }

            var methodInfo = memberInfo as IProxyMethodInfo;

            if (methodInfo != null)
            {
                return(new MethodTargetProxy(target, methodInfo));
            }

            return(null);
        }