我已经开始使用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中返回吗?我可以用一种打字机可以阅读和使用的字体来装饰这个方法吗?

最佳答案

好吧,所以我对这个问题没有答案,所以我会用我目前的解决方案来回答,这样可能会帮助其他人。
我创造了一个新的属性;

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

然后我用它来装饰我的api方法;
[ReturnType(typeof(MyModel))]
public async Task<IActionResult> DoSomething(){
    return Ok(MyModel);
}

现在在我的打字机文件中,我有以下代码;
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;
}

如您所见,我正在检查一个名为“returnType”的属性,然后获取这个属性的值(它是一个字符串),删除一些格式以获取原始对象名,然后返回这个。到目前为止,它很好地满足了我的需要。如果有人能想出更好的解决方案,请告诉我!
这不是我希望的最佳解决方案,因为如果您希望.ts文件中的类型正确,您需要确保ReturnType(typeof(Object))

10-07 14:47