C# 3.0'ın bize verdiği Lambda Expression nimetine ne kadar şükretsek az :) Bugün sizinle işimi kolaylaştırdığını düşündüğüm küçük bir kod bloğunu paylaşacağım.
Aşağıdaki gibi if blokları sıklıkla karşılaşırız. Çoğunlukla okuması zordur. Üstelik, nesnenin 2 defa üretilmesine neden olduğumuz için de performansdan da yeriz..
if(this.GetType().GetProperty(setSecurityPair.Key).GetSetMethod() != null)
{
this.GetType().GetProperty(setSecurityPair.Key).SetValue(this,null,null);
}
Burada bir reflection kod bloğu görmekteyiz. ve "this.GetType().GetProperty(setSecurityPair.Key)" kısmının da tekrar etmekte.. Peki kod bloğunu aşağıdaki hale dönüştürsek ?
this.GetType().GetProperty(setSecurityPair.Key).
DoIf(me => me.GetSetMethod() != null, me=> me.SetValue(this,null,null));
Nasıl? Güzel olmaz mı :) DoIf(...) methodumuz, birinci lambda delegate'i çalıştırıyor; true değeri dönmesi durumunda da ikinci delegate çalıştırıyor. İki delegate de parametre olarak nesnenin kendisini alıyor; böylece de nesnenin tekrar üretilmesinden de kurtulunmuş oluyor.. Pekiiii.... Nasıl mı implemente ediyoruz?
public static class CodeHelpers
{
public static void DoIf<T>(
this T instance,
Func<T,bool> ensure,
params Action<T>[] actionList) where T : class
{
if (ensure(instance))
{
foreach (var action in actionList)
{
action.Invoke(instance as T);
}
}
}
}
- Satır 4: Bu bir extension method
- Satır 5: İçine T tipinde değişken alan, geriye bool dönen bir method delegate
- Satır 6: İçine T tipinde değişken alan bir method delegate
Umarım sizin işinize de yarar, vizyonunuza "Cin Fikir"ler katar :)
Hiç yorum yok:
Yorum Gönder