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 است.
