예제 #1
0
        /// <summary>
        /// clientWarpper调用代码生成
        /// </summary>
        /// <param name="returnType"></param>
        /// <param name="tokenName"></param>
        /// <returns></returns>
        private static string ClientInvokeCode(Type returnType, string tokenName)
        {
            var isAsync = returnType.FullName.StartsWith(typeof(Task).FullName);

            if (isAsync)
            {
                //返回Task
                if (returnType == typeof(Task))
                {
                    return($"await _client.SendAsync(request,{tokenName});");
                }
                //返回Task<ResponseWrapper>
                if (returnType == typeof(Task <ResponseWrapper>))
                {
                    return($"return await _client.SendAndWrapAsync(request,{tokenName});");
                }
                if (returnType.IsGenericType)
                {
                    if (returnType.Namespace == typeof(Task <>).Namespace)
                    {
                        var genericArgument = returnType.GenericTypeArguments[0];
                        if (genericArgument.IsGenericType)
                        {
                            var argument = genericArgument.GenericTypeArguments[0];
                            //返回Task<ResponseWrapper<T>>
                            if (genericArgument.Namespace == typeof(ResponseWrapper <>).Namespace)
                            {
                                var argumentTemplate = new TypeTemplate(argument);
                                return($"return await _client.SendAndWrapAsync<{argumentTemplate}>(request,{tokenName});");
                            }
                            //返回Task<Generic<T>> task内部还是一个泛型类
                            return($"return await _client.SendAsync<{new TypeTemplate(argument)}>(request,{tokenName});");
                        }
                        //返回Task<T>
                        var template = new TypeTemplate(genericArgument);
                        return($"return await _client.SendAsync<{template}>(request,{tokenName});");
                    }
                }
            }
            //返回void
            if (returnType == typeof(void))
            {
                return($"_client.SendAndWrapAsync(request,{tokenName}).GetAwaiter().GetResult();");
            }
            //返回ResponseWrapper
            if (returnType == typeof(ResponseWrapper))
            {
                return($"return _client.SendAndWrapAsync(request,{tokenName}).GetAwaiter().GetResult();");
            }
            //返回ResponseWrapper<T>
            if (returnType.IsGenericType && returnType.Namespace == typeof(ResponseWrapper <>).Namespace)
            {
                var genericArgument = returnType.GenericTypeArguments[0];
                var template        = new TypeTemplate(genericArgument);
                return($"return _client.SendAndWrapAsync<{template}>(request,{tokenName}).GetAwaiter().GetResult();");
            }
            //返回 data
            return($"return _client.SendAsync<{new TypeTemplate(returnType)}>(request,{tokenName}).GetAwaiter().GetResult();");
        }
        public MethodTemplate(MethodInfo method)
        {
            Method     = method;
            Name       = method.Name;
            IsAsync    = method.ReturnType.FullName.StartsWith(typeof(Task).FullName);
            ReturnType = new TypeTemplate(method.ReturnType);
            foreach (var attr in CustomAttributeData.GetCustomAttributes(method))
            {
                AttributeList.Add(new CustomAttributeTemplate(attr).ToString());
            }
            //方法参数
            foreach (var parameter in method.GetParameters())
            {
                Parameters.Add(new ParameterTemplate(parameter));
            }

            if (method.IsGenericMethod)
            {
                foreach (var argumentType in method.GetGenericArguments())
                {
                    var argument = new GenericArgumentTemplate()
                    {
                        Name = argumentType.Name
                    };
                    GenericArguments.Add(argument);

                    if (argumentType.GenericParameterAttributes == GenericParameterAttributes.None &&
                        argumentType.GetGenericParameterConstraints().Length == 0)
                    {
                        continue;
                    }

                    //class约束
                    if (argumentType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.ReferenceTypeConstraint))
                    {
                        argument.Constraints.Add("class");
                    }
                    //值类型约束
                    if (argumentType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.NotNullableValueTypeConstraint))
                    {
                        argument.Constraints.Add("struct");
                    }

                    foreach (var type in argumentType.GetGenericParameterConstraints())
                    {
                        argument.Constraints.Add(new TypeTemplate(type).ToString());
                    }

                    //无参构造函数
                    if (argumentType.GenericParameterAttributes.HasFlag(GenericParameterAttributes.DefaultConstructorConstraint))
                    {
                        argument.Constraints.Add("new()");
                    }
                }
            }
        }