PDA

View Full Version : سوال: توابع توسعه (Extension Methods) چه توابعی هستند؟



ahrimaneahurai
چهارشنبه 11 خرداد 1390, 17:48 عصر
دوستان توابع توسعه یا Extension Methods چه توابعی هستند و به چه دردی میخورند؟ کجاها کاربرد دارند ؟

Reza_Yarahmadi
چهارشنبه 11 خرداد 1390, 18:46 عصر
این توضیحات رو آقای Sinpin توی سایت گذاشتند چون لینک پستشون رو ندارم متنش رو نقل قول میکنم


روشی برای تزریق یک متود تعریف شده به سایر کلاسها بدون دسترسی به سورس و کامپایل مجدد است.
(البته این تزریق بصورت موقت و ظاهری است و در پشت پرده از طریق یک متود استاتیک اینکار انجام میشود.)

مثال - میخواهیم متودی به کلاس string بیافزاییم که آخرین حرف یک رشته را برگرداند. یک کلاس استاتیک به شکل زیر تعریف میکنیم : (توجه : اسم کلاس اهمیتی ندارد)

public static class MyExtensions
{
public static string GetLastCharacter(this System.String str)
{
return str.Substring(str.Length-1, 1);
}
}

حال میتونیم این متد را در لیست متدهای یک string - مانند زیر - مشاهده کنیم :

string temp = "Sinpin";
MessageBox.Show( temp.GetLastCharacter());

ahrimaneahurai
چهارشنبه 11 خرداد 1390, 18:51 عصر
در واقع برای اضافه کردن یه سری توابع به کلاس هایی هست که به سورس اون ها دسترسی نداریم؟

amir-yeketaz
چهارشنبه 11 خرداد 1390, 19:29 عصر
کاربرد اصلیشون داخل LINQ هست! ... میخواین بفهمین چه متدهایی Extension Method هست یه بار یه آرایه درست کنید و یه نقطه بزنید تا اینتلایسنس بیاد بالا و به لیست متد ها نگاه کنید! اگه دقت کنید می بینید که بعضی متدها شکله کنارشون فرق داره که در واقع همون متدهای تزریق شده هستن! ... حالا از using system.linq رو حذف کنین این متدهام حذف میشن از لیست هر IEnumerable من جمله آرایه!)

در واقع اینی که گفتم Linq to Object بود!


موفق باشید ...

feriloo
دوشنبه 02 شهریور 1394, 15:53 عصر
extension method یا توابع توسعه حتما باید static باشند و باید داخل کلاس static تعریف شده باشند و قبل اولین پارامتر برای تشکیل متد توسعه باید از کلمه کلیدی this استفاده شود (دلیل اینکار برای این است که دیگر لازم نسیت که موقع فراخوانی برای متد توسعه متغیر را دوباره به متد پاس دهیم)
تعریف متد توسعه خیلی کار برنامه نویسی را راحت میکند ولی از طرفی محدودیت دسترسی به بعضی متغیرهاو... را دارد.
بیشتر برای کاربرد linq میباشد و یه سایت هم برای متدهای بدرد بخوری که درست میکنیم وجود داره : www.extensionmethod.net
برای تعریف extension method از روش زیر عمل میکنیم :

به عنوان مثال :

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}


private void Form1_Load(object sender, EventArgs e)
{
var a = "feri";
MessageBox.Show(a.getEncrypt());


}
}


public static class Extension
{
public static string getEncrypt(this string text)
{
return text + "!@#$%^&**()_+";
}
}