فصل 34 از 40 درس 1 از 1

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» با تمرکز بر ساختارهای اصلی زبان، الگوهای صحیح استفاده و خطاهای رایج بررسی شد. تسلط بر این مفاهیم زمینه لازم برای اتصال موضوع به فصل‌های بعدی و طراحی کدهای خواناتر، قابل نگهداری و قابل تست را فراهم می‌کند.