تعریف متد های Extension و نحوه استفاده از آن ها

در این مقاله تعریف متد های Extension و نحوه استفاده از آن ها به همراه مثال که به درک آن کمک بیشتری می کند ، ارائه می گردد .

متد های Extension متد هایی هستند که می توانند انواع موجود را بدون نیاز به ارث بری از یک کلاس گسترش دهند و منطق سفارشی خودتان را ایجاد می کند . همچنین می تواند به رابط نیز اعمال شود .

متد های Extension شما را قادر می سازند بدون ایجاد نوع جدید یا تغییر نوع اصلی متد هایی به انواع موجود اضافه کنید . یعنی می توانید متد ها را از هر نوعی که هستند گسترش دهید .

متد های Extension نوعی خاص از متد static هستند ، اما آن ها در صورتی که متد نمونه در نوع گسترش یافته باشند به این نوع نامیده می شوند .

متد های Extension را با اعلام آن به عنوان یک متد static ایجاد می کنیم اما در اینجا یک تغییر جزئی وجود دارد که آن را به یک متد که از یک نمونه فراخوانی شده است کامپایل می کند .

متد های Extension در NET 3.5. با LINQ به وجود آمده اند . LINQ یک ویژگی مهم در NET Framework. است ، که دارای چندین متد Extension که دستکاری اطلاعات را ساده تر می کند می باشد .

اکنون برای ایجاد متد Extension خود در ابتدا نیاز به یک کلاس static دارید.

در اینجا مثالی برای گسترش رشته ها (Strings) ارائه می گردد . یک متد ایجاد می کنیم .

    namespace Example.Extensions   
    {   
        public static class StringExtender   
        {   
        public static string TruncateAt(this string source   
        ,   int maxLength)   
        {   
        if (source.Length <= maxLength)   
        {   
        return source;   
        }   
      
        return source.Substring(0, maxLength);   
        }   
        }   
    }

این دستور ساده یک رشته را کوتاه می کند . زمانی که یک کلاس static و یک متد static ایجاد می کنیم و قبل از اولین پارامتر از آن استفاده می کنیم یعنی یک متد Extension داریم .

اکنون می خواهیم از آن استفاده کنیم :

    "I will be truncated, lol!".TruncateAt(6);

اگر با خطایی مواجه شدید ، دلیل ساده ای دارد . متد Extension با استفاده از فضای نام (namespace) ایجاد کردیم ، برای مثال Extensions .

در اینجا مثال پیچیده تری ارائه می شود :


    /// <summary>   
    /// Returns distinct elements from a sequence.   
    /// </summary>   
    /// <typeparam name="TSource">The type of the elements of source.</typeparam>   
    /// <typeparam name="TKey">The type of the key returned by keySelector.</typeparam>   
    /// <param name="source">The sequence to remove duplicate elements from.</param>   
    /// <param name="keySelector">A function to extract the key for each element.</param>   
    /// <param name="comparer">An System.Collections.Generic.IEqualityComparer<T> to compare keys.</param>   
    /// <exception cref="System.ArgumentNullException">source or keySelector is null.</exception>   
    /// <returns></returns>   
    public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source,   
    Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer = null)   
    {   
        if (source == null) throw new ArgumentNullException("source");   
        if (keySelector == null) throw new ArgumentNullException("keySelector");   
        var keys = new HashSet<TKey>(comparer);   
        foreach (var element in source)   
        {   
        if (keys.Add(keySelector(element)))   
        {   
            yield return element;   
        }   
        }   
    }

اگر می خواهید یک عکس را دستکاری کنید ، می بایست یک متد Crop ایجاد کنید.