#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
— означает, что это универсальный тип с одним параметром типа. Вам нужно вручную сконструировать этот возвращаемый тип, чтобы заставить его работать