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.

Relaterte artikler