16 Mart 2012 Cuma

[Cin Fikir - Mini Trick] DoIf(...)

Selamlar dostlar;
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
Çok basit bir yöntemle daha okunabilir ve kısa bir kod bloğu ortaya çıkartmış olduk..

Umarım sizin işinize de yarar, vizyonunuza "Cin Fikir"ler katar :)