CodeShot
Reflection1 دقیقه مطالعه

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 باید با احتیاط استفاده شود.

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

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