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 :)