Ejemplo n.º 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)
                ));
 }
Ejemplo n.º 2
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)}.");
            }
        }