C# – Extension Metot Kullanımı

Extension metotlar, mevcut sınıf ve struct yapılarının orjinalliklerini bozmadan yeni metotlar ve özellikler yazarak fonksiyonelliklerini genişletme ihtiyacından doğmuştur. Bu ihtiyacı var olan çözümlerle de (kalıtım, mevcut sınıfa metot ekleme, partial sınıf vs.) giderebiliriz. O halde neden extension metotları kullanıyoruz?

* .NET içinde yazılmış çok sayıda sealed olarak tanımlanmış tip ve sınıf mevcuttur. Bu durumu kendilerinden türeterek yazamayacağımız tip ve metotları extension metot kavramı ile aşabiliriz.

* Çalışılan projede çok sayıda sınıf var, yeni bir metot eklenmesi production ortamı için risk içeriyor olabilir. Bir metot için oluşturulacak partial sınıf mantığının bakımı da zorlaşabilir. Yine böyle bir durumda extension metotlar pratik bir yaklaşım olarak karşımıza çıkıyor.

Bir extension metot tanımlamak için;

* Statik bir sınıf içinde statik metot olarak tanımlanmalıdır.

* Extension metotta, genişletilecek sınıfın türü this anahtar sözcüğü ile parametre olarak alınmalıdır. Bu sınıf türü, this ile ele alınmazsa hiç bir zaman çağrılmayacaktır. Aynı zamanda bir metodu, kendi ismiyle genişletirseniz, yazılan extension metot yerine yine kendisi çağrılır.

internal static class StringExtensions
    {
        public static int CountWords(this string s)
        {
            var collection = Regex.Matches(s, @"[\S]+");
            return collection.Count;
        }
    }

Bu extension metot ile int sınıfını genişletmiş olduk, artık bu sınıftan türetilen objeler için kullanabiliriz.

Extension metotların IEnumerable objeler için kullanım örneklerini aşağıda bulabilirsiniz. Buna benzer faydalı extension metotları extensionmethod.net sitesinde bulabilir, siz de ekleyebilirsiniz. :)

public static class Extensions
{
    //listelerin null kontrolüne alternatif.
    public static IEnumerable<T> ToSafeList<T>(this List<T> source)
    {
        if (source != null)
            return source;
        return new T[0];
    }

    //ToList()'i belli bir sayı ile kullanmak için.
    public static List<T> ToList<T>(this IEnumerable<T> source, int count)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (count < 0)
            throw new ArgumentOutOfRangeException("count");

        var list = new List<T>(count);
        list.AddRange(source);

        return list;
    }

    //ToArray()'i belli bir sayı ile kullanmak için.
    public static T[] ToArray<T>(this IEnumerable<T> source, int count)
    {
        if (source == null)
            throw new ArgumentNullException("source");
        if (count < 0)
            throw new ArgumentOutOfRangeException("count");

        var array = new T[count];
        var i = 0;

        foreach (var item in source)
        {
            array[i++] = item;
        }

        return array;
    }

}