2011-11-11 21 views

cevap

61

Kişisel statik yöntem gitmek gerekir. Tam bir ayrıntı için lütfen aşağıdaki @ sll'nin cevabına bakınız.

84

Sen Func<T, TResult> genel temsilci kullanabilirsiniz. Ayrıca bir dönüş değeri dikkate yararlı genel temsilci vardır

Func<MyType, ReturnType> func = (db) => { return new MyTytpe(); } 

(MSDN bakınız):

  • Converter<TInput, TOutput> (MSDN)
  • Predicate<TInput> - her BOOL dönüş (MSDN)

Yöntem:

public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory) 

Jenerik temsilci:

Func<InputArgumentType, MyType> createInstance = db => return new MyType(); 

yürütün:

MyType myTypeInstance = SimpleUsing.DoUsing(
          createInstance(new InputArgumentType())); 

VEYA açıkça:

MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType()); 
+0

Doğru yöntemin nasıl görüneceğine dair bir örnek verebilir misiniz? – 4thSpace

+0

Bu siteye nasıl uyup uymadığımı anlamıyorum. Yöntem imzası ile gösterebiliyor musunuz (örn. Public static void DoUsing (Action action))? @ L.B: evet - benim gönderim sonuçtur. – 4thSpace

+3

@ L.B - Google'dan insanlara sormak yapıcı değildir. SO tam cevaplar sağlamak için var. –

11

Ayrıca lambda veya anonim bir yöntemin, kapsamı içindeki değişkenleri kapatabildiği gerçeğinden de yararlanabilirsiniz.

public static class SimpleUsing 
{ 
    public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action) 
    { 
     using (MyDataContext db = new MyDataContext()) 
      return action(db); 
    } 
} 

Bu cevap yüzden kod sağlayabilir yorumların dışında büyüyen:

public static class SimpleUsing 
{ 
    public static void DoUsing(Action<MyDataContext> action) 
    { 
     using (MyDataContext db = new MyDataContext()) 
      action(db); 
    } 
} 

için: den

MyType result; 

SimpleUsing.DoUsing(db => 
{ 
    result = db.SomeQuery(); //whatever returns the MyType result 
}); 

//do something with result 
+0

Evet, buna Kapatma (bizim için uygun olan eğlenceli dil öğeleri) denir. – sll

İlgili konular