Blog
.NET Source Generators: Class Declaration’ları Bulma
- 12 Eylül 2025
- Yayınlayan: svahabi
- Kategori: Blog Yazıları
Giriş
C# 9 ile birlikte tanıtılan Source Generators, derleme zamanı sırasında kod üreten güçlü bir özelliktir. Normalde runtime sırasında Reflection ile çözülebilecek birçok senaryo, Source Generators sayesinde compile-time seviyesinde analiz edilip kod üretilerek daha performanslı hale getirilebilir.
Bu yazıda özellikle class declaration’larını bulma konusuna odaklanacağız. Bir kaynağın (source) içinde tanımlanmış sınıfları tespit etmek, çoğu zaman otomatik kod üretimi için ilk adımdır. Örneğin:
-
Verilen sınıflara otomatik attribute eklemek
-
Marker interface implementasyonu kontrol etmek
-
Kod standartlarına uygunluğu doğrulamak
Syntax Tree ve Semantic Model
Source Generator yazarken, Roslyn API’si üzerinden kaynak kodu iki temel seviyede inceleyebiliriz:
-
Syntax Tree (Sözdizim Ağacı)
Kaynak kodun saf sözdizimini ifade eder. Örneğin, bir sınıfın adı, tanım satırı ve üyeleri. -
Semantic Model (Anlamsal Model)
Sınıfın hangi namespace altında bulunduğu, hangi base class’ı extend ettiği, hangi interface’leri implement ettiği gibi semantik bilgileri içerir.
Sınıf tespit etmek için çoğu durumda SyntaxReceiver veya ISyntaxContextReceiver kullanılır.
SyntaxReceiver ile Class Bulma
[code language="csharp"]
[Generator]
public class ClassCollectorGenerator : ISourceGenerator
{
public void Initialize(GeneratorInitializationContext context)
{
context.RegisterForSyntaxNotifications(() => new ClassCollectorReceiver());
}
public void Execute(GeneratorExecutionContext context)
{
if (context.SyntaxReceiver is not ClassCollectorReceiver receiver)
return;
foreach (var classDecl in receiver.Classes)
{
var className = classDecl.Identifier.Text;
// Burada tespit edilen sınıf üzerinden işlem yapılabilir
}
}
class ClassCollectorReceiver : ISyntaxReceiver
{
public List<ClassDeclarationSyntax> Classes { get; } = new();
public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
{
if (syntaxNode is ClassDeclarationSyntax classDecl)
{
Classes.Add(classDecl);
}
}
}
}
[/code]
Yukarıdaki örnekte:
-
OnVisitSyntaxNode, tüm syntax ağacındaki düğümleri gezer. -
ClassDeclarationSyntax, sadece sınıf tanımlarını yakalamak için filtre görevi görür. -
Böylece derleme sırasında projedeki tüm sınıf tanımlarına ulaşılabilir.
Semantic Model ile Daha Derin Analiz
Sadece sınıf adını almak çoğu zaman yeterli olmayabilir. Örneğin belirli bir attribute’a sahip sınıfları bulmak istiyorsak SemanticModel kullanmalıyız.
public void Execute(GeneratorExecutionContext context)
{
var compilation = context.Compilation;
if (context.SyntaxReceiver is not ClassCollectorReceiver receiver)
return;
foreach (var classDecl in receiver.Classes)
{
var model = compilation.GetSemanticModel(classDecl.SyntaxTree);
var symbol = model.GetDeclaredSymbol(classDecl);
if (symbol?.GetAttributes().Any(a => a.AttributeClass?.Name == “AutoGenerateAttribute”) == true)
{
// Bu sınıf için kod üret
}
}
}
Bu sayede yalnızca AutoGenerate attribute’una sahip sınıflar için özel kod üretebiliriz.
Kullanım Senaryoları
Class declaration’larını bulma ve işleme mekanizması birçok alanda işe yarar:
-
DTO sınıflarına otomatik
ToString()metodu eklemek -
Domain entity’ler için otomatik Repository oluşturmak
-
Belirli interface’leri implement eden sınıflara ek kod enjekte etmek
-
Boilerplate kodları azaltarak geliştiricinin işini hızlandırmak
Sonuç
.NET Source Generators, projelerde boilerplate kodu ortadan kaldırmak için güçlü bir araçtır. Özellikle sınıf tanımlarını yakalayarak özel kurallara göre kod üretmek, hem performansı artırır hem de geliştirme sürecini standartlaştırır.
Eğer siz de projelerinizde tekrarlayan kod bloklarıyla uğraşıyorsanız, sınıf yakalama mantığıyla başlayan bir Source Generator yazmayı deneyebilirsiniz. 🚀