来自IActionResult的Typewriter ReturnType

时间:2017-08-21 13:32:55

标签: c# typescript asp.net-web-api typewriter

我已经开始使用Typewriter来查看它是否符合我生成模型和API层的要求。

到目前为止,它正在生成模型,我让它生成某种API层,但是在使用$ReturnType时我遇到了障碍,如示例Angular Web API Service中所示。在示例代码中;

${
    using Typewriter.Extensions.WebApi;

    string ReturnType(Method m) => m.Type.Name == "IHttpActionResult" ? "void" : m.Type.Name;
    string ServiceName(Class c) => c.Name.Replace("Controller", "Service");
}
module App { $Classes(:ApiController)[

    export class $Name {

        constructor(private $http: ng.IHttpService) { 
        } $Methods[

        public $name = ($Parameters[$name: $Type][, ]) : ng.IHttpPromise<$ReturnType> => {

            return this.$http<$ReturnType>({
                url: `$Url`, 
                method: "$HttpMethod", 
                data: $RequestData
            });
        };]
    }

    angular.module("App").service("$ServiceName", ["$http", $Name]);]
}

正在使用$ReturnType,但是当您使用该方法调用.net WebApi控制器时;

public async Task<IActionResult> DoSomething(){
    return Ok(MyModel);
}

$ReturnTypeIActionResult,对我来说不够强类型。我希望它的类型为MyModel

我可以做些什么来获取Ok内返回的类型吗?我可以使用打字机可以读取和使用的类型来装饰方法吗?

2 个答案:

答案 0 :(得分:4)

好的,所以我在这个问题上没有答案,所以我会用现有的解决方案回答它,这样可能有助于其他人。

我创建了一个新属性;

public class ReturnTypeAttribute : Attribute
{     
    public ReturnTypeAttribute(Type t)
    {            
    }
}

然后我用它来装饰我的Api方法;

[ReturnType(typeof(MyModel))]
public async Task<IActionResult> DoSomething(){
    return Ok(MyModel);
}

现在在我的TypeWriter文件中,我有以下代码;

string ReturnType(Method m) {

    if (m.Type.Name == "IActionResult"){

        foreach (var a in m.Attributes){

            // Checks to see if there is an attribute to match returnType
            if (a.name == "returnType"){

                // a.Value will be in the basic format "typeof(Project.Namespace.Object)" or "typeof(System.Collections.Generic.List<Project.Namespace.Object>)
                // so we need to strip out all the unwanted info to get Object type
                string type = string.Empty;

                // check to see if it is an list, so we can append "[]" later
                bool isArray = a.Value.Contains("<");
                string formattedType = a.Value.Replace("<", "").Replace(">", "").Replace("typeof(", "").Replace(")", "");
                string[] ar;

                ar = formattedType.Split('.');
                type = ar[ar.Length - 1];

                if (isArray){
                    type += "[]";
                }

                // mismatch on bool vs boolean
                if (type == "bool"){
                    type = "boolean";
                }

                return type;
            }
        }

        return "void";
    }

    return m.Type.Name;
}

正如您所看到的,我正在检查名为&#34; returnType&#34;的属性,然后获取此属性的值,该属性是一个字符串,删除一些格式以获取原始对象名称,然后返回这个。到目前为止,它正在满足我的需求。如果有人能想出更好的解决方案,请告诉我!

这不是我希望的最佳解决方案,因为如果你想要.ts文件中的正确类型,你需要确保你有ReturnType(typeof(Object))

答案 1 :(得分:1)

在我的例子中,我从方法中的参数中获取返回类型:

// Turn IActionResult into void
string ReturnType(Method objMethod) 
{
    if(objMethod.Type.Name == "IActionResult")
    {
            if((objMethod.Parameters.Where(x => !x.Type.IsPrimitive).FirstOrDefault() != null))
            {
                return objMethod.Parameters.Where(x => !x.Type.IsPrimitive).FirstOrDefault().Name;
            }
            else
            {
                return "void";
            }
    } 
    else
    {
            return objMethod.Type.Name;
    }
}

请参阅:

Turbocharging Your Angular 4+ Development Using Typewriter