Kenar

Extension Method Nedir? Nasıl Yazılır?

Extension Methodu çok kısa olarak ifade etmek gerekir ise “Genişletilmiş Methodlar” diyebiliriz.

Extension methodalr ne zamandır beri vardır?

.NET 3.0 güncellemesi ile gelmiştir. Eee güzel gelmişte kullanıyor muyuz? Tabi ki kullanıyorsunuz buna inanıyorum. En basitinden “ToString();” Extension metodunu yazılım dünyasını yeni girmiş kişilerden bile kullanmayanınız yoktur.

Normal methodlar gibi new ile üretilemezler yani static(static methodlar .NET 2.0 ile gelmiştir.) olarak oluşturulur.

Gel gelelim Extension methodların çıkışının temel sebebi nedir?Yazılım çalışırken en dikkat edilmesi gereken şeylerden biride neden sonuç ilişkisidir. Extension methodlara ihtiyaç duyulmasının nedeni genişletemediğimiz tiplerin onlara özel yeni fonksiyonlar atamaktır.

Örnek

Mantığı daha iyi oturmak amaçlı sizlerle iki farklı tipin extension methodlarını karşılaştıralım.

tip1 tip2 tip3

  1. Entity den gelen bir DbSet tipinde
  2. İnt tipinde bir sayı değişkeni
  3. DataTable Tipinde

Sizinde gözünüze çarpan hepsinde ToString(); methodunun olmasıdır. Her tipte bulunmaktadır. Yani bazı methodlar sadece bir tipte, bazı methodlar tüm tiplerde ,bazı methodlar ise birden fazla method da olabiliyor. Bunun temel sebebi tip mimarisidir. Nasıl yani hocam? örneğin Extension methodunuzu sadece “List” ler için yazdınız o zaman List, List,List tiplerinde de görünür. Extensionınız da çalışacak tipin alt tiplerinde de geçerli olacaktır. Daha iyi bir örnek vermek gerekir ise örneğin “ToString();” Extension methodu her tipte çıkmasının sebebi “Object” tipine göre yazılmasıdır. Nasıl yani hocam? Şöyle her tip aslında bir objedir. Tabiri caizse “baba veri tipi” diyebiliriz her tip object tipinde türetilmiştir. Peki hocam illa bir tip mi gerekiyor generic yapamazmıyız? Tabi yapılabilir makalenin sonunda hem belirli tipe göre ve generic extension oluşturma örnekleri yapacağız.

Gel gelelim extension oluşturmadan önce neye dikkat etmeliyiz? Örneğin bir extension yazarak “MessageBox” ın “Show” isimli bir method yazarak farklı bir versiyon yada farklı bir method geliştirmek isteyebilirsiniz. Ancak deneyin olmayacak 🙂 Extension methodları yazabilmek için “New” lenebilir olmalıdır. Nasıl yani…? Şöyle düşünelim “Neler New ile üretilemez?” sorusunu kendimize soralım. Cevabi ise abstract ve static class’lardır.

Örnek Extension Method Geliştirme

Bir static class oluşturalım. Devamında class static olduğu için bir static method yazalım. Benim örneğim int bir verinin istenilen sayı ile çarpımıdır.

    public static class ExtensionMethod1
    {
        /// <summary>
        /// Sayının istenilen sayı ile çarpımı
        /// </summary>
        /// <param name="Sayi">Nokta bastınca çalışacak veri tipi ve kullanılacak değişken</param>
        /// <param name="KaclaCarpilacak">Girilecek ilk sayı parametresi</param>
        /// <returns>Çapımının int tipinde</returns>
        public static int Carp(this int Sayi, int KaclaCarpilacak)
        {
            return Sayi * KaclaCarpilacak;
        }
        /// <summary>
        /// Sayının 2 ile çarpımı
        /// </summary>
        /// <param name="Sayi">>Nokta bastınca çalışacak veri tipi ve kullanılacak değişken</param>
        /// <returns>Çapımının int tipinde</returns>
        public static int Carp(this int Sayi)
        {
            return Carp(Sayi, 2);
        }

    }

Burada “this” ile belirtilen noktaya bastığımızda ki veri tipidir. Burada belirtilen veri tipi “int/int32” olduğu için bu extension sadece “int” veri tiplerinde karşımıza çıkacaktır. Burada bir methotun 2 farklı versiyonunu yazdık. Yani Extension methodların normal methodlardan farklı olmadıkları overload edilebilebilirler.

Örnek Kullanım;

int Veri=Convert.ToInt32(textBox1.Text);
MessageBox.Show(Veri.Carp().ToString());

exrension method exrension2

Tek tiplik bir extension  yazdık peki tüm tipleri kabul edilebilecek nasıl yazılır? Evet “this object” olarak kullanır isek tüm tiplerde görünebilir. Ancak Object olarak kullanılır ise tip güvenliği olmamaktadır.

Örnek Generic Extension

    public static class ExtensionMethod2
    {
        public static IEnumerable<T> UzunlugaGoreSiralama<T, L>(this IEnumerable<T> names, Func<T, L> lengthProvider)
        {            
            return names
                .OrderBy(a => lengthProvider(a))
                .ThenBy(a => a);
        }
    }
string[] names = { "Jon", "Marc", "Joel", "Thomas", "Copsey", "Konrad", "Andrew", "Brian", "Bill" };
var result = names.UzunlugaGoreSiralama(a => a.Length);

Yorum bırakın