Неправильные символы в генерации кода и текстовых шаблонах T4

#c# #templates #generics #t4

#c# #шаблоны #обобщения #t4

Вопрос:

При создании контроллеров, контрактов и реализации для службы WCF я использую

  Microsoft FxCop 1.35FxCopSdk.dll
 Microsoft FxCop 1.35Microsoft.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}amp;pageindex={pageindex}amp;pagesize={pagesize}")]
    PagedList`1<Portal.BLL.BO.Employee> GetAllEmployees (String sortby, Int32 pageindex, Int32 pagesize);
  

обратите внимание на `1 (апостроф и 1) после returntypename, перед символом ниже, чем в нижней строке. Это происходит со всем сгенерированным кодом, который содержит общие типы возврата.

Интроспектор обнаруживает здесь что-то неправильное или это проблема кодирования?

Комментарии:

1. Это не проблема кодирования, PagedList'1<Portal.BLL.BO.Employee> — это то, как выглядит универсальный тип '1 — означает, что это универсальный тип с одним параметром типа. Вам нужно вручную сконструировать этот возвращаемый тип, чтобы заставить его работать

2. Ага, спасибо за эту очень полезную информацию? Не возражаете, если я приведу это в качестве ответа здесь?

Ответ №1:

Это не проблема кодирования, PagedList'1<Portal.BLL.BO.Employee> — это то, как выглядит универсальный тип '1 — означает, что это универсальный тип с одним параметром типа. Вам нужно вручную сконструировать этот возвращаемый тип, чтобы заставить его работать