Source generator nedir?
Source generator'ın ne olduğunu ve derleme zamanı kod üretimini öğrenirsin.
Source generator nedir?
Bir source generator, derleme sırasında çalışan ve derlemeye yeni C# kodu ekleyen bir Roslyn bileşenidir. Çalışma zamanında reflection yapmak yerine, gerekli kodu derleme zamanında üretir; böylece başlangıç süresi kısalır.
Üretilen kod, öğrencinin yazdığı kodun yanına ek kaynak dosyaları olarak eklenir. Generator'lar özellikle serileştirme, bağımlılık enjeksiyonu kaydı ve DTO üretiminde yaygın kullanılır.
Roslyn ve derleme zamanı
Source generator'lar, Roslyn derleyici platformunun bir parçasıdır. Derleyici sözdizim ağacını (syntax tree) ve anlamsal modeli (semantic model) generator'a sunar; generator da bunları inceleyip yeni kod üretir.
Bu, çalışma zamanı maliyetini derleme zamanına taşır. Örneğin, bir özniteliği (attribute) işaretleyen tüm sınıfları bulup her biri için yardımcı metotlar üretebilirsin.
Uygulama Bir sınıf tanımı üret
GeneratorDemo adında statik bir sınıf içinde public static string GenerateClass(string typeName) metodu yaz. Gövdede return $"public class {typeName} {{ }}"; döndür. Main içinde Console.WriteLine(GeneratorDemo.GenerateClass("UserDto")) çağır.
Örnek çözümü göster
GeneratorDemo içine GenerateClass metodunu ekle. Main içine Console.WriteLine(GeneratorDemo.GenerateClass("UserDto")); yaz.
Örnek çözüm:
using System;
static class GeneratorDemo
{
public static string GenerateClass(string typeName)
{
return $"public class {typeName} {{ }}";
}
}
class Program
{
static void Main()
{
Console.WriteLine(GeneratorDemo.GenerateClass("UserDto"));
}
}
Kendini test et
-
Source generator ne zaman çalışır?
- Çalışma zamanında (runtime)
- Derleme zamanında (compile time)
- Uygulama kapanırken
- İstek geldiğinde
Cevabı göster
Derleme zamanında (compile time) — Doğru. Source generator derleme sırasında çalışır.
-
Source generator kavramlarını eşleştir
- Compile time
- Kod üretim zamanı
- Roslyn
- Derleyici platformu
- Syntax tree
- Sözdizim ağacı
-
GenerateClass metodunu tamamla
public static string ____(string typeName) { return $"public class {typeName} {{ }}"; }Cevabı göster
public static string GenerateClass(string typeName) { return $"public class {typeName} {{ }}"; }