我已经开始使用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);
}
$ReturnType
是IActionResult
,对我来说不够强类型。我希望它的类型为MyModel
。
我可以做些什么来获取Ok
内返回的类型吗?我可以使用打字机可以读取和使用的类型来装饰方法吗?
答案 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;
}
}
请参阅: