C# Extension Methods – Genişletme Metodları #1 yazım ile C# eğitimse time devam ediyorum. Bu dersimizde çok güzel ve manyak kolaylık sağlayan bir konuya bakacağız. C# ‘ta en az bir proje geliştirmiş olan arkadaşlar eğer bunu bilmiyorlar ise gözleriniz parlayacak. Biliyorum çünkü benimde aynı şekilde olmuştu. Bu güzel dersi sizlerle kavuşturabildiğim için inanın bende mutluluk duyuyorum.
Extension metodları, bir tip üzerinde bir değişikliğe gitmeden yeni özellikler katmamzı sağlayan metotlardır
C# Extension Methods – Genişletme Metodları #1
Şimdi hepimiz
XXX.ToString();
metodunu biliyoruz ve kaç kere kullandığımızı sayamayız.
Şimdi bunun gibi metod daha düşünün.
XXX.ToInt16(); XXX.ToInt32(); XXX.ToInt64(); XXX.ToDouble(); XXX.ToBool();
Nasıl olurdu?
Hepimiz düşünmüşüzdür. Koskoca Microsoft neden bunları yapmamış, neden yapmıyor diye. Ama bu gibi metodları bizde yapabiliriz. Bu dersimizin içeriği de işte tam olarak bunu kapsıyor.
Hemen projemize bir class ekleyelim ve kodlarımızı yazalım. Ben class’a MyExtensionMethods adını verdim.
Şimdi ilk extension metodumuzu yazalım.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace mustafabukulmez_com_dersler._015_Extension_Methods { public static class MyExtensionMethods { public static int ToInt32(this object sayi) { try { if (sayi == null) throw new Exception(); int x = Convert.ToInt32(sayi); return x; } catch (Exception) { return 0; } } } }
Şuanda tüm class’ımızın içeriği yukarıdaki gibidir. ToInt32 metodumuz bir extension metoddur. Sonuna eklendiği object türündeki değişkeni convert.toint32 metodunu kullanarak int23’ye çevirmeye çalışacaktır. Eğer bir hata çıkarsa, yani diyelim ki içerisinde “aaaa” değeri olan bir string değişkenini int32 ye dönüştürmeye kalkarsak FormatException hatası alırız. Yani harf sayıya dönüştürülemez hatası alırız. Bu metodumuzda böylesi durumlar yaşanırsa hata çıkmaması için geriye 0 olarak değer döndürüyoruz.
C# Extension Methods
Bir metodun, extension metod olmasını sağlayan kısım parametre kısmındaki THIS kısmıdır.
public static int ToInt32(this object sayi)
this object dediğimizde bu extension metodumuz tüm object lerde çıkacaktır. Eğer buraya string yazarsak bu extension metod sadece string tipindeki değişkenlerin yada veriler için kullanabiliriz yada int yazarsak bu extension metod sadece int tipindeki değişken için kullanabiliriz. Geri kalan herşey normal metodlar gibidir.
Ayırca bu metodlara birden fazla parametre de gönderebiliyoruz.
Şimdi yukarıdaki genişleme metodunu nasıl kullanacağımızı görelim. Bu class içindeki metodları Extension Metod olarak kullanabilmek için class’ımızı using kısmına ekliyoruz. Aslında class’ımızın yer aldığı klasör yolunu ekliyoruz. Görelim. Projeme eklediğim bir formun kod kısmını olduğu gibi yazıyorum.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using mustafabukulmez_com_dersler._015_Extension_Methods; namespace mustafabukulmez_com_dersler._015_Extension_Methods { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string str = textBox1.Text; int i = str.ToInt32(); } } }
Using kısmında gördüğünüz
using mustafabukulmez_com_dersler._015_Extension_Methods;
kısmı class’ımın yer aldığı klasördür. Bu şekilde Class’ı import ettiğimizde extension metodlarımızı kullanabiliyoruz.
BİLGİ 1: Extension Class ile Extension Class’ı kullancağımız form aynı klasördeyseler yukarıdaki gibi using olarak class ‘ın yolunu yazmamıza gerek yoktur. Eğer class’larını farklı bir klasörde tutuyor iseniz class’ın klasör yolunu using olarak eklemelisiniz.
BİLGİ 2: C# ta, her şey temelde bir object’tir. String, int, Datetime, TextBox, Label. DataGirdView, List<T> herşey bir object’tir. Yani Object herşeyin babasıdır diyebiliriz. Tüm değişkenler Object türünün sınırlandırılmış ve çeşitlendirilmiş bir halidir. Tüm nesneler Object üzerinden türetilmiştir. Bu yüzden Object üzerine eklediğimiz extension metod herşeyin sonunda görünecektir.
private void Form1_Load(object sender, EventArgs e) { string str = textBox1.Text; int i = str.ToInt32(); i = textBox1.ToInt32(); i = this.ToInt32(); }
Bu sebeple Extension Metodlarımızı yazarken hangi tip için istiyorsak o tipe göre yazmaya özen gösterelim. Yoksa bir süre sonra object’in genişletmeleri çorba gibi olur.
Bu dersimi şimdilik bitiriyorum. Uzun bir ders olacağından bu dersi parça parça vereceğim.
C# Extension Methods – Genişletme Metodları #2
C# Extension Methods – Genişletme Metodları #3
C# Extension Methods – Genişletme Metodları #1, dersimizin sonuna geldik. Diğer derslerimizde görüşmek üzere…
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız.
Derslerime özel olarak hazırladığım Github Projeme buradan ulaşabilirsiniz…Bu dersimi ve Diğer partların hepsini Github projemde tek bir klasör içerisinde tutacağım.
Sağlıcakla ve takipte kalın. ;)