CodeBlanks Logo Icon CodeBlanks

Özet - Source generator'lar

C# kursu · Uzman · Ders 42/47

IIncrementalGenerator ve AddSource'u birleştirerek bir DTO üreteci yazarsın.

Özet - Source generator'lar

Bu özette bir DTO üreteci yazacaksın: bir tür listesinde Dto ile bitenleri süzer, her biri için bir sınıf tanımı üretir ve AddSource ile bir listeye ekler. Bu, gerçek bir source generator'ın çekirdek akışını simüle eder.

Önceki derslerde gördüğümüz Where, Select, AddSource ve foreach burada bir araya gelir. Çıktı deterministiktir çünkü liste sırası korunur.

DTO üreteci tasarımı

DtoGenerator statik sınıfı bir Sources listesi, bir AddSource metodu ve bir Generate metodu içerir. Generate, tür adlarını süzüp her biri için AddSource(name + ".g.cs", $"public class {name} {{ }}") çağırır.

Main, Generate'i üç adla çağırır; yalnızca Dto ile bitenler kaynak listesine eklenir. Sonra foreach ile hint adları yazdırılır.

Uygulama DTO üreteci birleştir

DtoGenerator statik sınıfı tanımla. public static List<(string Hint, string Source)> Sources { get; } = new();, public static void AddSource(string hintName, string source) (içinde Sources.Add((hintName, source));) ve public static void Generate(IEnumerable<string> typeNames) metotları olsun. Generate gövdesinde foreach (var name in typeNames.Where(n => n.EndsWith("Dto"))) ile AddSource(name + ".g.cs", $"public class {name} {{ }}") çağır. Main'de DtoGenerator.Generate(new[] { "User", "UserDto", "OrderDto" }) çağırıp foreach ile entry.Hint'leri yazdır.

Örnek çözümü göster
static class DtoGenerator { public static List<(string Hint, string Source)> Sources { get; } = new(); public static void AddSource(string hintName, string source) { Sources.Add((hintName, source)); } public static void Generate(IEnumerable<string> typeNames) { foreach (var name in typeNames.Where(n => n.EndsWith("Dto"))) AddSource(name + ".g.cs", $"public class {name} {{ }}"); } }. Main'de DtoGenerator.Generate(...), foreach (var entry in DtoGenerator.Sources) Console.WriteLine(entry.Hint);
Örnek çözüm:
using System;
using System.Collections.Generic;
using System.Linq;

static class DtoGenerator
{
    public static List<(string Hint, string Source)> Sources { get; } = new();
    public static void AddSource(string hintName, string source)
    {
        Sources.Add((hintName, source));
    }
    public static void Generate(IEnumerable<string> typeNames)
    {
        foreach (var name in typeNames.Where(n => n.EndsWith("Dto")))
        {
            AddSource(name + ".g.cs", $"public class {name} {{ }}");
        }
    }
}

class Program
{
    static void Main()
    {
        DtoGenerator.Generate(new[] { "User", "UserDto", "OrderDto" });
        foreach (var entry in DtoGenerator.Sources)
        {
            Console.WriteLine(entry.Hint);
        }
    }
}

Kendini test et

  1. DTO üreteci adımlarını eşleştir

    Where
    Dto ile bitenleri süz
    Select
    Sınıf tanımı üret
    AddSource
    Üretilen kodu listeye ekle
  2. Source generator'ın amacı nedir?

    • Çalışma zamanında reflection yapmak
    • Dosya okumak
    • Test yazmak
    • Derleme zamanı kod üretmek
    Cevabı göster

    Derleme zamanı kod üretmek — Doğru. Source generator derleme zamanı kod üretir.

  3. Generate çağrısını tamamla

    DtoGenerator.____(new[] { "User", "UserDto", "OrderDto" });
    Cevabı göster
    DtoGenerator.Generate(new[] { "User", "UserDto", "OrderDto" });

Uzman bölümündeki tüm dersler