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.