2011-11-11 13 views
54

इस प्रश्न के उत्तर के संबंध में Passing DataContext into Action(), मैं कार्रवाई (डीबी) से एक मूल्य कैसे वापस कर सकता हूं?कार्रवाई() से मूल्य कैसे वापस करें?

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

अधिक की तरह होना चाहिए:

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

उत्तर

61

आपका स्थिर विधि से जाना चाहिए। पूर्ण विस्तार के लिए, कृपया नीचे @ एसएलएल का उत्तर देखें।

84

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

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

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

  • Converter<TInput, TOutput> (MSDN)
  • Predicate<TInput> - हमेशा लौट bool (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()); 
+0

सही - क्या आप एक उदाहरण प्रदान कर सकते हैं कि विधि कैसा दिखना चाहिए? – 4thSpace

+0

मैं sitll का पालन नहीं करता कि यह कैसे फिट बैठता है। क्या आप इसे विधि हस्ताक्षर के साथ दिखा सकते हैं (यानी सार्वजनिक स्थैतिक शून्य DoUsing (एक्शन एक्शन))? @ एलबी: हाँ - मेरी पोस्ट परिणाम है। – 4thSpace

+3

@ एलबी - लोगों से Google से पूछना रचनात्मक नहीं है। एसओ पूर्ण जवाब प्रदान करने के लिए मौजूद है। –

11

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

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); 
    } 
} 

इस उत्तर टिप्पणियों के हिसाब से विकसित तो मैं कोड प्रदान कर सकता है

MyType result; 

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

//do something with result 
+0

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

संबंधित मुद्दे