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