代码生成和T4文本模板中的字符错误

时间:2011-04-13 07:44:06

标签: c# templates generics t4

在为WCF服务生成控制器,合同和实现时,我使用

 Microsoft FxCop 1.35\FxCopSdk.dll
 Microsoft FxCop 1.35\Microsoft.Cci.dll

获取有关基础业务对象类的信息。

相关的代码片段生成如下控制器:

摘自webservice.tt:

    public <#=meth.ReturnType.Name#> <#=meth.Name #> (<#=parametersIn#>) {
        return <#=meth.DeclaringType.Name#>.<#=meth.Name#>(<#=parametersOut#>);
    }

并且通常生成类似

的内容
    public Employee GetEmployee (Int64 id) {
        return EmployeeController.GetEmployee(id);
    }

然而

在介绍泛型时,meth.ReturnType.Name是一个通用集合,会生成奇怪的字符,生成的代码会被破坏。

例如,我首先在BLL程序集中生成一个控制器,如:

    public static PagedList<<#=t.Name#>> 
    GetAll<#=t.Name#>s(string sortby, int pageindex, int pagesize) {
        return <#=t.Name#>.GetPaged(sortby, pageindex, pagesize);
    }

导致:

    public static PagedList<Employee> 
    GetAllEmployees(string sortby, int pageindex, int pagesize) {
        return Employee.GetPaged(sortby, pageindex, pagesize);
    }

似乎进展顺利且程序集构建。 但是当我在这个程序集上使用内省来生成代码时 WCF组件,例如生成服务合同,如:

    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, UriTemplate = "<#=meth.Name#><#=parametersTemplate#>")]
    <#=meth.ReturnType.Name#> <#=meth.Name#> (<#=parametersIn#>);

它会生成错误的代码:

[OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json, 
    RequestFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Wrapped, 
    UriTemplate = "GetAllEmployees?sortby={sortby}&pageindex={pageindex}&pagesize={pagesize}")]
    PagedList`1<Portal.BLL.BO.Employee> GetAllEmployees (String sortby, Int32 pageindex, Int32 pagesize);

注意返回类型名称后的`1 (撇号和1),在底线的低于符号之前。所有生成的代码都包含通用返回类型。

内省运动员在这里选错了什么或是编码问题?

1 个答案:

答案 0 :(得分:3)

这不是编码问题,PagedList'1<Portal.BLL.BO.Employee> - 泛型类型看起来像'1 - 意味着这是具有一种类型参数的泛型类型。您需要手动构造此返回类型才能使其正常工作