CodeShot
Source Generator2 دقیقه مطالعه

Source Generator در C# چیست؟

قابلیتی در C# که به کامپایلر اجازه می‌دهد هنگام Build، کد C# جدید تولید کند و به‌جای Reflection در Runtime، Performance را بالا ببرد.

چرا مهم است؟

Source Generator جایگزین بسیاری از استفاده‌های Reflection شده و پایه ابزارهایی مثل System.Text.Json و Regex Source Generator در .NET مدرن است.

تعریف کوتاه

Source Generator قابلیتی در C# است که به کامپایلر اجازه می‌دهد در زمان Compile، کد C# جدید تولید و به پروژه اضافه کند — بدون این‌که توسعه‌دهنده آن را دستی بنویسد. به‌جای این‌که برنامه در Runtime کد بسازد، این کد هنگام Build تولید می‌شود.

چرا ایجاد شد؟

کاهش Reflection در Runtime · افزایش Performance · تولید خودکار کدهای تکراری · بهبود زمان اجرا و Startup برنامه

نحوه کار

Code → Compile → Source Generator → Generate C# Code → Final Assembly

Source Generator بخشی از فرآیند Compilation است و با Roslyn Compiler کار می‌کند.

کاربردهای مهم

۱. تولید کدهای تکراری — DTO Mapping، Serialization، Validation، Dependency Injection Registration، Logging؛ به‌جای نوشتن دستی یک UserMapper، Generator این کد را می‌سازد.

۲. جایگزینی Reflection — روش قدیمی:

var properties = typeof(User).GetProperties(); // کندتر، هزینه Runtime دارد

با Source Generator، کد مستقیم تولید می‌شود و Reflection حذف می‌شود.

۳. بهبود Serialization — نمونه معروف System.Text.Json که برای تولید Metadata از Source Generator استفاده می‌کند:

بدون Generator: Object → Reflection → JSON
با Generator:   Object → Generated Code → JSON

انواع Source Generator

نوع ویژگی
Incremental Source Generator نسخه پیشنهادی، سریع‌تر، فقط بخش تغییرکرده را پردازش می‌کند
Classic Source Generator (ISourceGenerator) نسخه قدیمی‌تر، کمتر استفاده می‌شود

مثال ساده

[GenerateToString]
public class Person
{
    public string Name { get; set; }
}

Generator می‌تواند خودکار تولید کند:

public override string ToString() => Name;

مزایا و معایب

مزایا معایب
Performance بهتر، کاهش Reflection و Boilerplate پیچیدگی بیشتر در Debug
خطای کمتر در تولید کد نیاز به شناخت Roslyn
مناسب Library Development زمان Build ممکن است افزایش یابد

Source Generator در برابر Reflection

Reflection Source Generator
زمان اجرا Runtime Compile Time
سرعت کمتر بیشتر
تولید کد ندارد دارد
Debug ساده‌تر پیچیده‌تر

تفاوت با T4 Template

T4 معمولاً قبل از Build اجرا می‌شود و فایل فیزیکی تولید می‌کند؛ Source Generator بخشی از Compiler Pipeline است و کد تولیدی را داخل همان Compilation قرار می‌دهد.

نمونه‌های معروف در .NET

System.Text.Json · Regex Source Generator · Logging Source Generator · ASP.NET Core Minimal API · کتابخانه‌های Dependency Injection

نکته کلیدی: Source Generator کد را هنگام Compile تولید می‌کند تا نیاز به Reflection و کدنویسی تکراری کاهش پیدا کند و Performance برنامه افزایش یابد.

خلاصه

  • Source Generator در زمان Compile کد C# جدید تولید می‌کند، نه در Runtime مثل Reflection.
  • کاربرد اصلی: کاهش Reflection، تولید DTO Mapping/Serialization و کاهش کدهای تکراری.
  • Incremental Source Generator نسخه مدرن و سریع‌تر است و پایه ابزارهایی مثل System.Text.Json در .NET است.

حالا امتحان کن

🧩آزمون Source Generator در C#6 سؤال · نمره قبولی 60٪
این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←