در توسینسو تدریس کنید

و

با دانش خود درآمد کسب کنید

آموزش Reflection در برنامه های دات نت قسمت 4 : Attibute ها

در ادامه موضوع Reflection، به مبحث برنامه نویسی با Attribute ها می پردازیم. به خاطر دارید که در قسمت اول این آموزش گفتیم هر Type ای در دات نت شامل یکسری Meta Data است که آن Type را توصیف می کنند. برای مثال، Meta Data های یک متد نوع بازگشتی آن، نام متد و پارامترهای آن را مشخص می کنند، همچنین Type ای که آن متد در آن تعریف شده و CLR بوسیله این Meta Data ها می تواند از آن ها استفاده کند. همچنین در Visual Studio با پنجره ای به نام Intellisense آشنا شدیم، اطلاعات داخل این پنجره نیز به وسیله Meta Data ها نمایش داده می شوند. اما Attribute ها این بین چه نقشی دارند؟ بوسیله Attribute ها می توانیم یکسری اطلاعات یا Meta Data های اضافی به Type ها و اعضاء Type ها اضافه کنیم. با یک مثال جلو می رویم. کلاسی تعریف می کنیم که شامل یک متد static برای ست کردن تاریخ و زمان است:

public class Utitlities
{
    public static void SetDateAndTime(int year, int month, int day, int hour, int minute, int second)
    {
            
    }
}

بعد از مدتی، تغییری در این کلاس ایجاد می شود، دو متد static جدید با نام های SetTime و SetDate نوشته می شوند که کار ست کردن تاریخ و زمان را به تفکیک انجام می دهند:

public class Utitlities
{
    public static void SetDateAndTime(int year, int month, int day, int hour, int minute, int second)
    {
    }

    public static void SetDate(int year, int month, int day)
    {
            
    }

    public static void SetTime(int hour, int minute, int second)
    {
            
    }
}

خوب تا اینجا مشکلی وجود نداره. حال فرض کنید قصد داریم این کلاس را به برنامه نویسان دیگر نیز بدهیم که از آن استفاده کنند، اما برنامه داریم که برای نسخه بعدی این کلاس، متد SetDateAndTime رو حذف کنیم و باید سایر افراد از این موضوع مطلع باشند. برای اینکار می توان از Attribute ای با نام Obsolete استفاده کرد. از این Attribute به صورت زیر استفاده می کنیم:

[Obsolete]
public static void SetDateAndTime(int year, int month, int day, int hour, int minute, int second)
{
}

همانطور که مشاهده می کنید، نام Attribute را بین [] نوشتیم. با این کار زمان استفاده از کلاس Utilities، در کنار نام متد SetDateAndTime عبارت Deprecated نمایش داده می شود:

آشنایی با قابلیت Reflection در برنامه های دات نت :: قسمت چهارم - برنامه نویسی مبتنی بر Attribute ها


زمان نمایش Intellisense، با خواندن Meta Data های مربوط به Type ها و اعضاء آن، در صورتی که Obsolete بر روی متد استفاده شده باشد، این عبارت نمایش داده می شود. اما استفاده از Attribute به همین مورد خلاصه نمی شود. شما می توانید با نوشتن Attribute های مورد نیاز خود، کارهای متفاوتی انجام دهید. برای ایجاد Attribute های جدید، ابتدا می بایست با کلاسی با نام Attribute آشنا شویم. این کلاس یک کلاس Base برای کلیه Attribute های تعریف شده در سیستم است و تنها می توان از یک کلاس به عنوان Attribute استفاده کرد که از کلاس Attribute مشتق شده باشند. با یک مثال ساده شروع می کنیم. برنامه Meta Data Viewer را به خاطر دارید؟ می خواهیم اطلاعاتی جدیدی به Meta Data های Type ها با نام Author که منظور نویسنده کلاس است اضافه کنیم. برای اینکار ابتدا باید Attribute مورد نظر را تعریف کنیم:

public class AuthorAttribute : Attribute
{

}

بر اساس قواعد نام گذاری، کلیه کلاس هایی که به عنوان Attribute تعریف می شوند، نام آن ها باید با عبارت Attribute تمام شود. حال می توانیم از این Attribute به صورت زیر استفاده کنیم:

[Author]
public class Person
{

}

به دو موضوع باید اینجا دقت کنید، یکی اینکه زمان استفاده از Attribute، نیازی به نوشتن عبارت Attribute در انتهای نام آن نیست، سیستم به صورت خودکار این موضوع را تشخیص می دهد. موضوع دوم هم اینکه اگر کلاس AuthorAttribute از کلاس Attribute مشتق نشود، زمان استفاده از کلاس به صورت بالا، پیغام خطا دریافت خواهیم کرد. حال در قدم بعدی می خواهیم Attribute های استفاده شده بر روی Person را به دست آوریم. برای اینکار باید از Reflection کمک بگیریم:

var personType = typeof(Person);
var author = personType.GetCustomAttribute();
if(author != null)
{
    Console.WriteLine("Type has an author!");
}

بوسیله متد GetCustomAttribute که یک متد جنریک است، می توان Attribute مورد نظر را بدست آورد. کافیست نوع Attribute مورد نظر را به عنوان پارامتر جنریک به این متد پاس دهید. در صورتی که Attribute مشخص شده بر روی Type مورد نظر قرار داده شده باشد، شئ ای از نوع آن Attribute و در غیر اینصورت مقدار null بر گردانده خواهد شد. در مثال بالا، با یک شرط بررسی کردیم که اگر author مقدار داشته باشد، پس نویسنده دارد و پیامی را در خروجی چاپ می کنیم. اما Author به این صورت کاربردی ندارد! ما باید بتوانیم زمان استفاده از آن نام نویسنده را نیز مشخص کنیم. کلاس AuthorAttribute را به صورت زیر تغییر می دهیم:

public class AuthorAttribute : Attribute
{
    public string Name { get; set; }
}

حال زمان استفاده از کلاس می توان به صورت زیر عمل کرد:

[Author(Name ="Hossein Ahmadi")]
public class Person
{

}

در کد بالا، زمان استفاده از کلاس می توان به عنوان پارامتر ورودی به صورت نوشته شده، خصوصیات تعریف شده برای Attribute را مقدار دهی کرد. البته اگر برای Attribute سازنده تعریف کنیم کار راحت تر می شود:

public class AuthorAttribute : Attribute
{
    public AuthorAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}

و شیوه استفاده از Attribute:

[Author("Hossein Ahmadi")]
public class Person
{

}

به دلیل استفاده از سازنده، دیگر نیازی به نوشتن نام خصوصیت در زمان استفاده از Attribtue نیست. در ادامه کد اصلی را برای نمایش نام نویسنده به صورت زیر تغییر می دهیم:

var personType = typeof(Person);
var author = personType.GetCustomAttribute();
if(author != null)
{
    Console.WriteLine("Type Author: {0}", author.Name);
}

علاوه بر تعریف Attribute ها، می توان یکسری تنظیمات نیز برای آن ها انجام داد. برای مثال Attribute تعریف شده را بتوان چند بار بر روی یک Type استفاده کرد یا خیر یا Attribute تعریف شده تنها بر روی کلاس ها قابل استفاده باشد یا تنها بر روی خصوصیات. برای اینکار باید از Attribute ای با نام AttributeUsage استفاده کنیم که بر روی Attribute های تعریف شده قرار می گیرند. برای مثال، Attribute ای که نوشتیم را جوری تغییر می دهیم که تنها بر روی کلاس ها قابل استفاده باشد و همچنین نتوان بیش از یک بار آن را بر روی یک کلاس نوشت:

[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
public class AuthorAttribute : Attribute
{
    public AuthorAttribute(string name)
    {
        Name = name;
    }

    public string Name { get; set; }
}

پارامتر اول که به صورت سازنده پاس داده می شود از نوع Enum ای با نام AttributeTargets است که در اینجا ما Class را انتخاب کردیم، یعنی Attribute ما تنها بر روی کلاس ها قابل استفاده است، همچنین یک خصوصیت با نام AllowMultiple را به مقدار false ست کردیم. یعنی نمی توان چندین بار این Attribute را بر روی یک کلاس نوشت. Attribute ها کاربردهای فراوانی دارند که یکی از آن ها نوشتن برنامه Extendable است که در بخشی مجزا به این موضوع خواهیم پرداخت. امیدوارم که این آموزش مورد توجه شما قرار گرفته باشد. ITPRO باشید

نویسنده: حسین احمدی
انجمن تخصصی فناوری اطلاعات ایران
#کار_با_attribute_ها_در_سی_شارپ #آموزش_زبان_سی_شارپ #reflection_در_سی_شارپ #آموزش_پیشرفته_سی_شارپ
عنوان
1 آموزش Reflection در برنامه های دات نت قسمت 1 : معرفی رایگان
2 آموزش Reflection در برنامه های دات نت قسمت 2 : Meta Data Viewer رایگان
3 آموزش Reflection در برنامه های دات نت قسمت 3 : Late Binding رایگان
4 آموزش Reflection در برنامه های دات نت قسمت 4 : Attibute ها رایگان
زمان و قیمت کل 0″ 0
0 نظر

هیچ نظری ارسال نشده است! اولین نظر برای این مطلب را شما ارسال کنید...

نظر شما
برای ارسال نظر باید وارد شوید.
از سرتاسر توسینسو
تنظیمات حریم خصوصی
تائید صرفنظر
×

تو می تونی بهترین نتیجه رو تضمینی با بهترین های ایران بدست بیاری ، پس مقایسه کن و بعد خرید کن : فقط توی جشنواره تابستانه می تونی امروز ارزونتر از فردا خرید کنی ....