Пример #1
0
        static WorkflowCallbackInterfaceInfo()
        {
            operationNames = new VirtualArray <Type, VirtualArray <Type, List <string> > >();

            List <string> validationMessages = new List <string>();

            if (!typeof(TWorkflowCallbackInterface).IsInterface)
            {
                validationMessages.Add($"TWorkflowCallbackInterface type '{typeof(TWorkflowCallbackInterface).GetFriendlyName()}' must be an interface!");
            }

            // Valid method signatures:
            // Task<Func<Task<...>>> ...(... requestParameter)
            // Task<Func<Task>> ...(... requestParameter)
            // Task<Func<Task<...>>> ...()
            // Task<Func<Task>> ...()
            foreach (MethodInfo method in OperationInfo <TWorkflowCallbackInterface> .OperationMethods)
            {
                Type            requestParameterType = typeof(void);
                ParameterInfo[] parameters           = method.GetParameters();
                if (parameters.Length > 1)
                {
                    validationMessages.Add($"TWorkflowCallbackInterface '{method.DeclaringType.GetFriendlyName()}' method '{method.Name}' can have max. 1 parameter (of any type)!");
                }
                else if (parameters.Length == 1)
                {
                    requestParameterType = parameters[0].ParameterType;
                }

                Type responseResultType = typeof(void);
                Type returnType         = method.ReturnType;
                if (returnType != typeof(Task <Func <Task> >) &&
                    (!returnType.IsGenericTypeOf(typeof(Task <>)) ||
                     !returnType.GetGenericArguments()[0].IsGenericTypeOf(typeof(Func <>)) ||
                     !returnType.GetGenericArguments()[0].GetGenericArguments()[0].IsGenericTypeOf(typeof(Task <>))))
                {
                    validationMessages.Add($"TWorkflowCallbackInterface '{method.DeclaringType.GetFriendlyName()}' method '{method.Name}' return type must be Task<Func<Task>> or Task<Func<Task<...>>>!");
                }
                else if (returnType.GetGenericArguments()[0].GetGenericArguments()[0].IsGenericType)
                {
                    responseResultType = returnType.GetGenericArguments()[0].GetGenericArguments()[0].GetGenericArguments()[0];
                }

                operationNames[requestParameterType][responseResultType].Add(OperationInfo <TWorkflowCallbackInterface> .GetOperationName(method));
            }

            IsValidWorkflowCallbackInterface = validationMessages.Count() == 0;
            if (!IsValidWorkflowCallbackInterface)
            {
                StringBuilder sb = new StringBuilder();
                foreach (string validationMessage in validationMessages)
                {
                    sb.AppendLine(validationMessage);
                }
                ValidationMessage = sb.ToString();

                operationNames.Clear();
            }
        }
        static WorkflowInterfaceInfo()
        {
            operationNames = new VirtualArray <Type, VirtualArray <Type, List <string> > >();

            var validationMessages = new List <string>();

            if (!typeof(TWorkflowInterface).IsInterface)
            {
                validationMessages.Add($"TWorkflowInterface type '{typeof(TWorkflowInterface).GetFriendlyName()}' must be an interface!");
            }

            // Valid method signatures:
            // Task <...> ...(Func<Task<...>> requestResult)
            // Task ...(Func<Task<...>> requestResult)
            // Task <...> ...(Func<Task> requestResult)
            // Task ...(Func<Task> requestResult)
            foreach (var method in OperationInfo <TWorkflowInterface> .OperationMethods)
            {
                var responseParameterType = typeof(void);
                var returnType            = method.ReturnType;
                if (returnType != typeof(Task) &&
                    !returnType.IsGenericTypeOf(typeof(Task <>)))
                {
                    validationMessages.Add($"TWorkflowInterface '{method.DeclaringType.GetFriendlyName()}' method '{method.Name}' return type must be Task or Task<...>!");
                }
                else if (returnType.IsGenericType)
                {
                    responseParameterType = returnType.GetGenericArguments()[0];
                }

                var requestResultType = typeof(void);
                var parameters        = method.GetParameters();
                if (parameters.Length != 1)
                {
                    validationMessages.Add($"TWorkflowInterface '{method.DeclaringType.GetFriendlyName()}' method '{method.Name}' must have 1 parameter!");
                }
                if (parameters.Length >= 1)
                {
                    var parameterType = parameters[0].ParameterType;
                    if (parameterType != typeof(Func <Task>) &&
                        (!parameterType.IsGenericTypeOf(typeof(Func <>)) ||
                         !parameterType.GetGenericArguments()[0].IsGenericTypeOf(typeof(Task <>))))
                    {
                        validationMessages.Add($"TWorkflowInterface '{method.DeclaringType.GetFriendlyName()}' method '{method.Name}' parameter type must be Func<Task> or Func<Task<...>>!");
                    }
                    else if (parameterType.GetGenericArguments()[0].IsGenericType)
                    {
                        requestResultType = parameterType.GetGenericArguments()[0].GetGenericArguments()[0];
                    }
                }

                operationNames[requestResultType][responseParameterType].Add(OperationInfo <TWorkflowInterface> .GetOperationName(method));
            }

            IsValidWorkflowInterface = validationMessages.Count() == 0;
            if (!IsValidWorkflowInterface)
            {
                var sb = new StringBuilder();
                foreach (var validationMessage in validationMessages)
                {
                    sb.AppendLine(validationMessage);
                }
                ValidationMessage = sb.ToString();

                operationNames.Clear();
            }
        }