एक्शन () से वैल्यू कैसे लौटाएं?


92

इस प्रश्न के उत्तर देने के संबंध में DataContext in Action () , मैं एक्शन (db) से मान कैसे लौटाऊं?

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

अधिक होना चाहिए:

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

जवाबों:


97

आपकी स्थैतिक विधि से जाना चाहिए:

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

सेवा:

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

यह जवाब टिप्पणियों से बढ़ा, ताकि मैं कोड प्रदान कर सकूं। पूर्ण विस्तार के लिए, कृपया नीचे दिए गए @ sll का उत्तर देखें।


113

आप Func<T, TResult>सामान्य प्रतिनिधि का उपयोग कर सकते हैं । ( MSDN देखें )

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

इसके अलावा उपयोगी सामान्य प्रतिनिधि हैं जो रिटर्न मान मानते हैं:

  • Converter<TInput, TOutput>( MSDN )
  • Predicate<TInput>- हमेशा रिटर्न बूल ( MSDN )

तरीका:

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

सामान्य प्रतिनिधि:

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

निष्पादित:

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

या स्पष्ट रूप से:

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

सही - क्या आप इस बात का उदाहरण प्रदान कर सकते हैं कि विधि क्या दिखना चाहिए?
मील की दूरी

5
@ एलबी - लोगों को Google से पूछना रचनात्मक नहीं है। SO पूर्ण उत्तर प्रदान करने के लिए मौजूद है।
Kirk Woll

5
@KirkWoll लेकिन उत्तर सामग्री देता है , इसे पकाया
LB

9
@ एलबी - यह पूरा होने के लिए बेहतर है। मुझे आपका सादृश्य सहज प्रतीत होता है।
Kirk Woll

1
@ एलबी, टिप्पणी नहीं करने के लिए बेहतर है क्योंकि आप किसी भी मूल्य को कभी भी जोड़ नहीं रहे हैं।
नं।

15

आप इस तथ्य का भी लाभ उठा सकते हैं कि एक लैम्ब्डा या अनाम विधि इसके संलग्न दायरे में चर पर बंद हो सकती है।

MyType result;

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

//do something with result

हाँ, इसे क्लोजर कहा जाता है (funcitonal भाषा का सामान जो हमारे लिए भी उपलब्ध है)
sll

4

के Func<T>बजाय का उपयोग करें Action<T>

Action<T>टाइप टी के पैरामीटर के साथ एक शून्य विधि की Func<T>तरह काम करता है , जबकि बिना किसी पैरामीटर के एक फ़ंक्शन की तरह काम करता है और जो टाइप टी का एक ऑब्जेक्ट देता है।

यदि आप अपने फ़ंक्शन को पैरामीटर देना चाहते हैं, तो उपयोग करें Func<TParameter1, TParameter2, ..., TReturn>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.