Action () 'dan değer nasıl döndürülür?


95

Bu sorunun cevabıyla ilgili olarak, DataContext'i Action () ' a geçirmek için, action'dan (db) nasıl bir değer döndürürüm?

SimpleUsing.DoUsing(db => { 
// do whatever with db 
}); 

Daha çok şöyle olmalı:

MyType myType = SimpleUsing.DoUsing<MyType>(db => { 
// do whatever with db.  query buit using db returns MyType.
}); 

Yanıtlar:


100

Statik yönteminiz şunlardan gitmelidir:

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

Kime:

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

Bu cevap yorumlardan doğdu, böylece kod sağlayabildim. Tam bir detaylandırma için lütfen aşağıdaki @ sll'nin cevabına bakın.


114

Func<T, TResult>Genel temsilci kullanabilirsiniz . (Bkz. MSDN )

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

Ayrıca, bir dönüş değerini dikkate alan yararlı genel temsilciler vardır:

  • Converter<TInput, TOutput>( MSDN )
  • Predicate<TInput>- her zaman bool döndür ( MSDN )

Yöntem:

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

Genel temsilci:

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

Yürüt:

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

VEYA açıkça:

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

6
@LB - insanlardan google'ı istemek yapıcı değildir. SO, tam yanıtlar sağlamak için vardır.
Kirk Woll

5
@KirkWoll Fakat cevap verir maddeler , bu şekilde sahip değil pişmiş
LB

9
@LB - tamamlanması daha iyi. Benzetmenizi sahte buluyorum.
Kirk Woll

1
@LB, herhangi bir değer katmadığınız için yorum yapmamak daha iyidir.
4thSpace

1
@Shn_Android_Dev - haklısınız, ancak Action bir değer döndürmek için bir olanak değil, kesinlikle geri dönüp tekerleği yeniden keşfedebiliriz, ancak bu tür kod karmaşıklığı esas olarak Action'a bağlı kalmaya değer mi?
sll

15

Ayrıca bir lambda veya anonim yöntemin, kapsama alanındaki değişkenleri kapatabileceği gerçeğinden de yararlanabilirsiniz.

MyType result;

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

//do something with result

evet, bu (aynı zamanda bizim için kullanılabilir funcitonal dil şeyler) Closure'u denir
sll

4

Kullanım Func<T>yerine Action<T>.

Action<T>T türü parametresi olan bir void yöntemi gibi davranırken, parametresi olmayan ve T türünde Func<T>bir nesne döndüren bir işlev gibi çalışır.

Fonksiyonunuza parametreler vermek isterseniz, kullanın Func<TParameter1, TParameter2, ..., TReturn>.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.