c# - Betinget utslipp av en metode med TypeWriter
Jeg bruker TypeWriter for å generere TypeScript-klasser fra mine C#-modeller. Det fungerer flott. Følgende er min eksisterende mal i sin helhet, som fungerer bra:
${
using Typewriter.Extensions.Types;
Template(Settings settings)
{
settings.IncludeProject("ProjectName.Api");
settings.OutputFilenameFactory = file =>
{
return file.Name.Replace("Dto.cs", ".ts");
};
}
string DtoName(Class t) { return t.Name.Replace("Dto", ""); }
string MapTypeName(Property p) { return MapTypeName(p.Type); }
string MapTypeName(Type t)
{
var typeArguments = t.TypeArguments.ToList();
if (typeArguments.Count == 1 && t.IsEnumerable)
{
return $"{MapTypeName(typeArguments[0])}[]";
}
if (typeArguments.Count == 2 && t.Name == $"KeyValuePair<{typeArguments[0]}, {typeArguments[1]}>")
{
return $"{{ key: {typeArguments[0]}; value: {typeArguments[1]}}}";
}
return t.Name.Replace("Dto", "");
}
}
module CompanyName.Models.Api {
$Classes(ProjectName.Api.Models.*Dto)[
export class $DtoName {
$Properties[
public $name: $MapTypeName = $Type[$Default];]
}]
}
Jeg vil legge til en metode betinget i denne malen for en spesifikk type. Jeg trodde noe sånt som dette ville fungere:
module CompanyName.Models.Api {
$Classes(ProjectName.Api.Models.*Dto)[
export class $DtoName {
$Properties[
public $name: $MapTypeName = $Type[$Default];]
${
if ($name == "ADto")
{
// I want to emit this code:
// public getStatistic(appType: string, status: string): number {
// const retval = _.find(this.data, { appType: appType, status: status });
// return retval ? retval.count : 0;
// }
}
}
}]
}
Men den liker ikke denne syntaksen, og jeg får 5 Typewriter-feil, inkludert "uventet token" og "ugyldig token". Jeg forsøkte en variasjon av dette:
module CompanyName.Models.Api {
$Classes(ProjectName.Api.Models.*Dto)[
export class $DtoName {
$Properties[
public $name: $MapTypeName = $Type[$Default];]
$if ($name == "ADto")
{
// I want to emit this code:
// public getStatistic(appType: string, status: string): number {
// const retval = _.find(this.data, { appType: appType, status: status });
// return retval ? retval.count : 0;
// }
}
}]
}
Men Typewriter sender ut hele $if { ... }-blokken, som ikke akkurat er det jeg ønsker.
Må jeg lage en egen mal spesielt for denne klassen, eller kan jeg gjøre dette med betingelsen? Hvis ja, hvordan?
Svar #1
Jeg fant det ut, basert på denne kommentaren på Github-problemet
I hoveddelen, over malen, legg til denne hjelpefunksjonen:
bool IsStatisticsClass(Class c)
{
return c.Name == "ADto";
}
Dette gir oss en slags innpakning (jeg er ikke sikker på hva den riktige terminologien er). Vi kan bruke $IsStatisticsClass[ ... ] for betinget å legge til kode. Selve malen blir:
module CompanyName.Models.Api {
$Classes(ProjectName.Api.Models.*Dto)[
export class $DtoName {
$Properties[
public $name: $MapTypeName = $Type[$Default];]
$IsStatisticsClass[
// This code is now emitted for a single class:
// public getStatistic(appType: string, status: string): number {
// const retval = _.find(this.data, { appType: appType, status: status });
// return retval ? retval.count : 0;
// }]
}]
}
For konsistensens skyld med spørsmålet mitt har jeg latt den genererte TypeScript-koden stå utkommentert.
