PDA

View Full Version : سوال: راهنمایی در مورد Extension Methods



hadi-z
شنبه 28 آبان 1390, 09:55 صبح
سلام
کسی میتونه در مورد Extension Methods به من توضیح بده؟

نحوه استفاده ؟ مورد استفاده ؟

ممنون میشم راهنماییم کنید.

mehdi.mousavi
دوشنبه 30 آبان 1390, 18:46 عصر
سلام کسی میتونه در مورد Extension Methods به من توضیح بده؟ نحوه استفاده ؟ مورد استفاده ؟ ممنون میشم راهنماییم کنید.

سلام.
فرض کنید کلاسی داریم که میخواهیم به اون توابع جدیدی اضافه کنیم. در حالت عادی، تنها راه برای انجام این کار این هستش که کلاس جدیدی ایجاد کنیم و اونو از کلاس مورد نظر Derive کنیم و در Derived Class توابع مورد نظر رو بنویسیم. اما برخی اوقات، ممکنه کلاسی که قصد Extend کردن اونو داریم، sealed مارک شده باشه، در نتیجه، نمی تونیم از اون کلاس، کلاس جدیدی مشتق کنیم. یا برخی اوقات، احساس می کنیم که کلاس مورد نظرمون، فاقد متود دلخواهمون هستش، اما هرگز نیاز به ایجاد Type جدیدی نداریم... فرضا میخواهیم تابعی به کلاس string اضافه کنیم که تعداد ارقام موجود در یک رشته رو بهمون بده...

اینجاست که Extension Method ها وارد بازی میشن. Extension Method به شما اجازه میده تا متود مورد نظرتون رو به Class موجود اضافه کنید، طوریکه از دید استفاده کننده اون کلاس، هیچ تفاوتی بین اون متود و فرضا متود Trim که روی string هستش، دیده نشده. برای اینکار، کلاس جدیدی ایجاد می کنیم:

public static class MyExtensionMethod
{
public static int TotalNumberOfDigits(this string str)
{
}
}


و متود مورد نظرمون رو با Signature فوق می نویسیم. دقت کنید که متود static هستش، و اولین پارامتر متود نیز با this دکوریت شده. این Signature به Compiler میفهمونه که ما بدنبال چه هدفی هستیم (و الا در حالت عادی، استفاده از this بدین شکل، میسر نیست). به Data Type پارامتر اول متود دقت کنید (که string هستش). این نشون میده که ما قصد Extend کردن کلاس string رو داریم... حالا، میتونیم تابع مورد نظر، یعنی شمردن تعداد ارقام موجود در رشته رو کامل کنیم:


public static class MyExtensionMethod
{
public static int TotalNumberOfDigits(this string str)
{
int total = 0;
foreach (char ch in str)
{
if (char.IsDigit(ch))
total++;
}

return total;
}
}


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

string myStr = "yet another test, 839";
int numberOfDigits = myStr.TotalNumberOfDigits();

همونطوریکه می بینید، با string به گونه ای برخورد شده که گویی TotalNumberOfDigits از ابتدا روی کلاس string پیاده سازی شده... شایع ترین استفاده از Extension Method ها، استفاده از اونها در Operator های LINQ هستش که بصورت Extension Method پیاده سازی شده اند.

موفق باشید.