Пример #1
0
        public ReactMethodInfo(ReflectionMethodInfo methodInfo, ReactMethodAttribute methodAttribute)
        {
            MethodName = methodAttribute.MethodName ?? methodInfo.Name;

            Type returnType = methodInfo.ReturnType;

            ParameterInfo[] parameters = methodInfo.GetParameters();
            if (returnType != typeof(void))
            {
                MethodReturnType = MethodReturnType.Callback;
                MethodImpl       = new Lazy <ReactMethodImpl>(() => MakeReturningMethod(methodInfo, returnType, parameters), LazyThreadSafetyMode.PublicationOnly);
            }
            else
            {
                if (parameters.Length > 0 && typeof(Delegate).IsAssignableFrom(parameters[parameters.Length - 1].ParameterType))
                {
                    if (parameters.Length > 1 && typeof(Delegate).IsAssignableFrom(parameters[parameters.Length - 2].ParameterType))
                    {
                        MethodReturnType = MethodReturnType.Promise;
                        MethodImpl       = new Lazy <ReactMethodImpl>(() => MakePromiseMethod(methodInfo, parameters), LazyThreadSafetyMode.PublicationOnly);
                    }
                    else
                    {
                        MethodReturnType = MethodReturnType.Callback;
                        MethodImpl       = new Lazy <ReactMethodImpl>(() => MakeCallbackMethod(methodInfo, parameters), LazyThreadSafetyMode.PublicationOnly);
                    }
                }
                else
                {
                    MethodReturnType = MethodReturnType.Void;
                    MethodImpl       = new Lazy <ReactMethodImpl>(() => MakeFireAndForgetMethod(methodInfo, parameters), LazyThreadSafetyMode.PublicationOnly);
                }
            }
        }
        public ReactMethodInfo(MethodInfo methodInfo, ReactMethodAttribute methodAttribute)
        {
            MethodName = methodAttribute.MethodName ?? methodInfo.Name;

            Type returnType = methodInfo.ReturnType;

            ParameterInfo[]        parameters                = methodInfo.GetParameters();
            Type                   lastParameterType         = parameters.Length > 0 ? parameters[parameters.Length - 1].ParameterType : null;
            Type                   secondToLastParameterType = parameters.Length > 1 ? parameters[parameters.Length - 2].ParameterType : null;
            Func <ReactMethodImpl> createMethod;

            bool isPromise(Type type)
            {
                var typeInfo = type?.GetTypeInfo();

                if (typeInfo != null && typeInfo.IsGenericType)
                {
                    var genericArgs = type.GetGenericArguments();
                    if (genericArgs.Length == 1)
                    {
                        return(typeof(IReactPromise <>).MakeGenericType(genericArgs).IsAssignableFrom(type));
                    }
                }
                return(false);
            }

            bool isCallback(Type type) => type != null && typeof(Delegate).IsAssignableFrom(type);

            if (returnType != typeof(void))
            {
                MethodReturnType = MethodReturnType.Callback;
                createMethod     = () => MakeReturningMethod(methodInfo, returnType, parameters);
            }
            else if (isPromise(lastParameterType))
            {
                MethodReturnType = MethodReturnType.Promise;
                createMethod     = () => MakePromiseMethod(methodInfo, parameters);
            }
            else if (isCallback(lastParameterType))
            {
                if (isCallback(secondToLastParameterType))
                {
                    MethodReturnType = MethodReturnType.TwoCallbacks;
                    createMethod     = () => MakeTwoCallbacksMethod(methodInfo, parameters);
                }
                else
                {
                    MethodReturnType = MethodReturnType.Callback;
                    createMethod     = () => MakeCallbackMethod(methodInfo, parameters);
                }
            }
            else
            {
                MethodReturnType = MethodReturnType.Void;
                createMethod     = () => MakeFireAndForgetMethod(methodInfo, parameters);
            }

            MethodImpl = new Lazy <ReactMethodImpl>(createMethod, LazyThreadSafetyMode.PublicationOnly);
        }