متدهای Extension جهت اضافه کردن یک متد اضافی یا دلخواه به لیست متدهای اشیایی که جزو اشیاء کلیدی و رزرو شده دات نت یا کلاسهای ساخته شده شرکتهای دیگر هست می باشد
مثلا دات نت یک کلاس بنام Datetimeداره که در فضای نام System هست خب وقتی فیلدی تعریف میکنیم از نوع DateTime بدین صورت:
public DateTime date{get;set;}
و بخوایم تاریخ رو در یک تکست باکس نشون بدیم بدین صورت هست
textbox.text=date.ToShortDateString();
خب ما نیاز به یک تاریخ شمسی داریم اگر بعد از date نگاه کنیم فقط متدهای پیش فرض وجود دارند مثل ToShortDateString ولی ما نیاز به تاریخ شمسی داریم
یکی از راههای خوب و مناسب همین Extensions متدهاست
کافیه یک کلاس static تعریف کنیم بعد درون این کلاس یک متد از نوع string تعریف و این متد یک ورودی از نوع DateTime هم قبول میکند اسم کلاس دلخواه هست میزاریم شمسی و یک تابع بنام ToShamsi هم اضافه میکنیم ذکر کلمه this قبل از ارگومان الزامی هست چون باید مشخص کنبم که این متد بر روی کلاسهای از نوع DateTiem اجرا میشود
public static class ShamsiDate
{
public static string ToShamsi(this DateTime dt)
{
try
{
var dateSh = new System.Globalization.PersianCalendar();
return dateSh.GetYear(dt) + "/" + dateSh.GetMonth(dt).ToString("00") + "/" + dateSh.GetDayOfMonth(dt).ToString("00");
}
catch (NotImplementedException ex)
{
return ex.ToString();
}
}
}
تابع اضافی آماده شد به همین سادگی .
در مثال قبل میایم یک بار دیگه تاریخ درون یک تکست باکس نمایش بدیم
var dt= DateTime.Now;
textbox.text=dt.ToShamsi();
اینبار یک ToShamsi به لیست متدهای تاریخ اضافه شده که میاد تاریخ رو تبدیل به شمسی میکننه
میتونید یک تست بزنید و امتحان کنید
خب برای تبدبل تاریخ میلادی به شمسی هم بر عکس متد ToShamsi یک تا بع اضافه کنید بنام ToMiladi ولی آرگومان تابع از نوع string باشه و بدنه تابع از نوع DateTime چون تاریخ شمسی یک نوع رشته حساب میشه و باید به نوع DateTime تبدبل و به دیتابیس ارسال کنیم
public static DateTime ToMiladi(this string shamsiDate)
{
if (!string.IsNullOrEmpty(shamsiDate))
{
var pc = new PersianCalendar();
DateTime dt = Convert.ToDateTime(pc.ToDateTime(Convert.ToInt32(s hamsiDate.Substring(0, 4)),
Convert.ToInt32(shamsiDate.Substring(5, 2)),
Convert.ToInt32(shamsiDate.Substring(8, 2)), 0, 0, 0, 0, PersianCalendar.PersianEra)
);
return dt;
}
return DateTime.Now;
}
حالا قضیه برعکس شد وقتی یک تکست باکس داشته باشیم و تاریخ شمسی دورنش باشه برای تبدیل به شمسی کافیه بنویسیم
DateTime dt;
dt=textbox.text.ToMiladi;
این از متدهای الحاقی موفق باشید