Reflection و Attribute
Reflection و Attribute
بخشی از آموزش جامع C# و .NET 10
محتوای درس Reflection و Attribute
Reflection امکان بررسی Type، Member و Metadata در زمان اجرا را فراهم میکند و Attribute روشی برای الصاق Metadata ساختیافته به کد است. بسیاری از Frameworkهای .NET از این دو قابلیت استفاده میکنند.
۱. Type Metadata
کلاس Type اطلاعاتی درباره Propertyها، Methodها، Constructorها و Interfaceها ارائه میکند.
مثال
Type t=typeof(List<int>); Console.WriteLine(t.FullName);در این مثال، مفهوم «Type Metadata» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۲. typeof و GetType
typeof برای Type معلوم در زمان کامپایل و GetType برای Type واقعی یک Object در زمان اجرا استفاده میشود.
مثال
object x="text"; Console.WriteLine(typeof(string)==x.GetType());در این مثال، مفهوم «typeof و GetType» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۳. Attribute
Attribute کلاس مشتقشده از System.Attribute است که روی Assembly، Type یا Member اعمال میشود.
مثال
[Obsolete("Use New")] static void Old(){}در این مثال، مفهوم «Attribute» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۴. Custom Attribute
برای Metadata دامنهای میتوان Attribute اختصاصی تعریف و با Reflection بازیابی کرد.
مثال
[Obsolete("Use New")] static void Old(){}در این مثال، مفهوم «Custom Attribute» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۵. محدودیتها
Reflection انعطافپذیر اما نسبت به دسترسی مستقیم کندتر و کمType-safeتر است؛ استفاده باید هدفمند باشد.
مثال
static class Counter { private static int _x; public static int Next()=>Interlocked.Increment(ref _x); }در این مثال، مفهوم «محدودیتها» در یک قطعه کد مستقل نمایش داده شده است. مقدارها و نامها عمداً ساده انتخاب شدهاند تا رفتار اصلی قابل مشاهده باشد؛ در پروژه واقعی همین الگو با مدل دامنه، اعتبارسنجی و مدیریت خطای متناسب ترکیب میشود.
۶. مثالهای عملی
Type type = typeof(Product);
foreach (PropertyInfo property in type.GetProperties())
{
Console.WriteLine($"{property.Name}: {property.PropertyType.Name}");
}این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
[AttributeUsage(AttributeTargets.Property)]
public sealed class DisplayLabelAttribute : Attribute
{
public string Label { get; }
public DisplayLabelAttribute(string label) => Label = label;
}این نمونه عملی چند مفهوم فصل را در کنار هم قرار میدهد و برای مشاهده رفتار واقعی کد قابل اجرا و تغییر است.
۷. خطاهای رایج
• استفاده از Reflection برای جایگزینی طراحی Type-safe ساده
• تکرار Reflection پرهزینه در حلقه بدون Cache
• Attributeهای مبهم با اثرات جانبی پنهان
۸. نکات اجرایی
• نامها، Typeها و Methodها را متناسب با مفهوم دامنه و بدون ابهام انتخاب کنید.
• هشدارهای کامپایلر و Nullable را بدون بررسی خاموش نکنید.
• منطق هر بخش را تا حد امکان کوچک، قابل تست و مستقل از I/O غیرضروری نگه دارید.
۹. تمرین عملی
Attribute با نام Exportable تعریف کنید و با Reflection فقط Propertyهای علامتگذاریشده یک Object را نمایش دهید.
۱۰. جمعبندی
در این فصل، مبانی «Reflection و Attribute» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصلهای بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم میکند.