Özet - Source generator'lar
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
-
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
-
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.
-
Generate çağrısını tamamla
DtoGenerator.____(new[] { "User", "UserDto", "OrderDto" });Cevabı göster
DtoGenerator.Generate(new[] { "User", "UserDto", "OrderDto" });