Reflection در C# چیست؟
قابلیتی در .NET که به برنامه اجازه میدهد در Runtime اطلاعات Typeها، متدها و Attributeهای خودش را بررسی و حتی اجرا کند.
چرا مهم است؟
Reflection موتور پنهان Dependency Injection، ORMها، Serialization و بیشتر Frameworkهای عمومی .NET است؛ فهمیدنش یعنی فهمیدن اینکه ابزارها چطور زیر پوست کار میکنند.
تعریف کوتاه
Reflection قابلیتی در .NET است که اجازه میدهد برنامه در Runtime اطلاعات Typeها، کلاسها، متدها، Propertyها و Attributeهای یک Assembly را بررسی و حتی تغییر دهد.
کاربردهای اصلی
بررسی اطلاعات یک کلاس در Runtime · ساخت Object بدون دانستن نوع آن در Compile Time · فراخوانی متد بهصورت Dynamic · خواندن Attribute · ساخت Frameworkها و ابزارهای عمومی
using System.Reflection;
گرفتن اطلاعات Type
Type type = typeof(Person);
// یا
Type type = person.GetType();
Console.WriteLine(type.Name); // Person
Property و Method در Runtime
PropertyInfo[] properties = type.GetProperties();
MethodInfo[] methods = type.GetMethods();
ساخت Object و اجرای متد بهصورت Dynamic
Type type = typeof(Calculator);
object instance = Activator.CreateInstance(type);
MethodInfo method = type.GetMethod("Sum");
var result = method.Invoke(instance, new object[] { 5, 10 }); // 15
خواندن Attribute
[Obsolete]
public class TestClass { }
var attributes = typeof(TestClass).GetCustomAttributes();
کاربردهای واقعی در .NET
Dependency Injection (پیدا کردن و ثبت Serviceها) · ASP.NET Core MVC (پیدا کردن Controller/Action) · Entity Framework Core (Mapping کلاس به جدول) · Serialization (تبدیل Object به JSON/XML) · Unit Testing Frameworkها (پیدا کردن Test Method)
مزایا و معایب
| مزایا | معایب |
|---|---|
| انعطافپذیری بالا | کندتر از فراخوانی مستقیم |
| ساخت Frameworkهای عمومی | کاهش Type Safety |
| مناسب کدهای Dynamic | Debug سختتر و مصرف بیشتر منابع |
تفاوت با حالت عادی
| حالت عادی | Reflection |
|---|---|
| Type مشخص در Compile | Type در Runtime بررسی میشود |
| سریعتر | کندتر |
| Type Safe | Dynamic |
typeof() در برابر GetType()
typeof(Person) وقتی Type در Compile مشخص است؛ person.GetType() نوع واقعی Object را در Runtime برمیگرداند.
نکته کلیدی: Reflection قدرتمند ولی کند است؛ برای کد عادی توصیه نمیشود و بیشتر در Frameworkها، Pluginها، ORMها و ابزارهای عمومی بهکار میرود.
خلاصه
- Reflection اجازه میدهد در Runtime به اطلاعات Type، Property، Method و Attribute یک کلاس دسترسی پیدا کنیم.
- Activator.CreateInstance و MethodInfo.Invoke اجازه ساخت Object و اجرای متد بدون دانستن نوع دقیق در Compile Time را میدهند.
- Reflection پایه Dependency Injection، ORM و Serialization در .NET است اما بهخاطر هزینه Performance باید با احتیاط استفاده شود.
