コード例 #1
0
 static ICommand CreateCommand(object instance, string methodName, string[] methodArguments, Dictionary <string, object> contextParameters)
 {
     return(CommandConstructor(
                () => MethodReflection.Invoke(instance, methodName, methodArguments, contextParameters),
                () => MethodReflection.CanInvoke(instance, methodName, methodArguments, contextParameters)
                ));
 }
コード例 #2
0
        public void Test004Name()
        {
            var method = new MethodReflection();
            var result = method.NameOf(() => GetStringNoOptimization() == GetStringNoOptimization());

            Assert.AreEqual("op_Equality", result);
        }
コード例 #3
0
        public void Test004()
        {
            var method = new MethodReflection();
            var result = method.From(() => GetStringNoOptimization() == GetStringNoOptimization());

            Assert.AreEqual(typeof(string).GetMethod("op_Equality", new Type[] { typeof(string), typeof(string) }), result);
        }
コード例 #4
0
        public void Test003Name()
        {
            var method = new MethodReflection();
            var result = method.NameOf(() => default(string).IndexOf(default(char), default(int)));

            Assert.AreEqual("IndexOf", result);
        }
コード例 #5
0
        public void Test003()
        {
            var method = new MethodReflection();
            var result = method.From(() => default(string).IndexOf(default(char), default(int)));

            Assert.AreEqual(typeof(string).GetMethod("IndexOf", new Type[] { typeof(char) , typeof(int) }), result);
        }
コード例 #6
0
        public void Test001Name()
        {
            var method = new MethodReflection();
            var result = method.NameOf(() => default(string).TrimEnd());

            Assert.AreEqual("TrimEnd", result);
        }
コード例 #7
0
        public void Test001()
        {
            var method = new MethodReflection();
            var result = method.From(() => default(string).TrimEnd());

            Assert.AreEqual(typeof(string).GetMethod("TrimEnd"), result);
        }
コード例 #8
0
    private DecisionTreeLoader()
    {
        MethodReflection = Singleton.Instance <MethodReflection>();
        ThreadHelper     = Singleton.Instance <MultiThreadHelper>();

        EvaluatorType = typeof(Func <bool>);
        ActionType    = typeof(UnityAction);
    }
コード例 #9
0
        /// <summary>
        /// 属性
        /// </summary>
        /// <param name="property">属性</param>
        /// <exception cref="ArgumentException"></exception>
        private Property(PropertyInfo property)
        {
            if (property == null)
            {
                throw new ArgumentNullException();
            }

            this.Source     = property;
            this.Name       = property.Name;
            this.ValidRules = this.GetValidRules(property);
            this.getter     = MethodReflection.CreateInvoker(property.GetGetMethod());
        }
コード例 #10
0
        /// <summary>
        /// 属性
        /// </summary>
        /// <param name="property">属性</param>
        /// <exception cref="ArgumentException"></exception>
        public Property(PropertyInfo property)
        {
            if (property == null)
            {
                throw new ArgumentNullException();
            }

            this.Name       = property.Name;
            this.Source     = property;
            this.ValidRules = GetValidRules(property);

            if (property.CanRead == true)
            {
                this.getter = MethodReflection.CreateInvoker(property.GetGetMethod());
            }
            if (property.CanWrite == true)
            {
                this.setter = MethodReflection.CreateInvoker(property.GetSetMethod());
            }
        }
コード例 #11
0
 /// <summary>
 /// 属性的Setter
 /// </summary>
 /// <param name="property">属性</param>
 public PropertySetter(PropertyInfo property)
 {
     this.methodInvoker = MethodReflection.CreateInvoker(property.GetSetMethod());
     this.Name          = property.Name;
     this.Type          = property.PropertyType;
 }
コード例 #12
0
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var targetPropertyType = GetPropertyType(serviceProvider);

            if (targetPropertyType == typeof(ICommand))
            {
                var instance = GetPropertyInstance(serviceProvider);
                return(MatchMethodSignature(Path, (methodName, methodArguments) =>
                                            CreateCommand(instance, methodName, methodArguments, contextParameters: null)));
            }
            else if (targetPropertyType.Name == "RuntimeMethodInfo")
            {
                var instance           = GetPropertyInstance(serviceProvider);
                var propertyMemberInfo = GetPropertyMemberInfo(serviceProvider);
                var eventName          = Regex.Match(propertyMemberInfo.Name, "Add(.*)Handler").Groups[1].Value;

                Type eventHandlerType;
                var  @event = instance.GetType().GetEvent(eventName);
                if (@event != null)
                {
                    eventHandlerType = @event.EventHandlerType;
                }
                else
                {
                    var routedEvent = EventManager.GetRoutedEventsForOwner(propertyMemberInfo.DeclaringType).Single(e => e.Name == eventName);
                    eventHandlerType = routedEvent.HandlerType;
                }
                return(MatchMethodSignature(Path, (methodName, methodArguments) =>
                                            CreateEventHandler(eventHandlerType, (contextParameters) => MethodReflection.Invoke(instance, methodName, methodArguments, contextParameters))));
            }
            else if (targetPropertyType.Name == "RuntimeEventInfo")
            {
                var instance  = GetPropertyInstance(serviceProvider);
                var eventName = GetPropertyMemberInfo(serviceProvider).Name;
                var @event    = instance.GetType().GetEvent(eventName);
                return(MatchMethodSignature(Path, (methodName, methodArguments) =>
                                            CreateEventHandler(@event.EventHandlerType, (contextParameters) => MethodReflection.Invoke(instance, methodName, methodArguments, contextParameters))));
            }
            else if (targetPropertyType.Name == "RuntimePropertyInfo")
            {
                var instance           = GetPropertyInstance(serviceProvider);
                var propertyMemberInfo = GetPropertyMemberInfo(serviceProvider);
                var propertyType       = propertyMemberInfo.GetType().GetProperty("PropertyType")?.GetValue(propertyMemberInfo) as Type;
                if (propertyType == null)
                {
                    return(null);
                }
                else if (typeof(ICommand).IsAssignableFrom(propertyType))
                {
                    return(MatchMethodSignature(Path, (methodName, methodArguments) =>
                                                CreateCommand(instance, methodName, methodArguments, contextParameters: null)));
                }
                else if (typeof(Func <DependencyObject, object>).IsAssignableFrom(propertyType))
                {
                    var commandType = propertyType.GenericTypeArguments[1];
                    if (typeof(ICommand).IsAssignableFrom(commandType))
                    {
                        return(ConvertFactory(returnType: commandType, factory: remoteInstance =>
                                              MatchMethodSignature(Path, (methodName, methodArguments) =>
                                                                   CreateCommand(remoteInstance, methodName, methodArguments, contextParameters: null))));
                    }
                    else
                    {
                        return(ConvertFactory(returnType: commandType, factory: remoteInstance =>
                                              MatchMethodSignature(Path, (methodName, methodArguments) =>
                                                                   CreateEventHandler(commandType, (contextParameters) => MethodReflection.Invoke(remoteInstance, methodName, methodArguments, contextParameters)))));
                    }
                }
                else
                {
                    return(MatchMethodSignature(Path, (methodName, methodArguments) =>
                                                CreateEventHandler(propertyType, (contextParameters) => MethodReflection.Invoke(instance, methodName, methodArguments, contextParameters))));
                }
            }
            else
            {
                throw new NotSupportedException($"\"{Path}\" not supported as {nameof(CommandBinding)}.");
            }
        }
コード例 #13
0
        public void Test005Name()
        {
            var method = new MethodReflection();
            var result = method.NameOf(() => (decimal)GetIntNoOptimization());

            Assert.AreEqual("op_Implicit", result);
        }
コード例 #14
0
        public void Test005()
        {
            var method = new MethodReflection();
            var result = method.From(() => (decimal)GetIntNoOptimization());

            Assert.AreEqual(typeof(decimal).GetMethod("op_Implicit", new Type[] { typeof(int) }), result);
        }