2009-12-09 14 views
9

पैरामीटर के रूप में किसी भी प्रतिनिधि को स्वीकार करने के लिए मुझे एक विधि लिखने में रूचि है जो पैरामीटर के रूप में एक और विधि स्वीकार करेगी लेकिन एक विशिष्ट हस्ताक्षर में लॉक नहीं होना चाहता - क्योंकि मुझे इसकी परवाह नहीं है। मुझे केवल दिलचस्पी है कि विधि लागू होने पर अपवाद फेंकता है या नहीं। क्या .NET Framework में कोई निर्माण है जो मुझे किसी भी प्रतिनिधि को पैरामीटर के रूप में स्वीकार करने की अनुमति देगा?पैरामीटर

उदाहरण के लिए, निम्न कॉल के सभी (भार के उपयोग के बिना!) काम करना चाहिए:

DoesItThrowException(doSomething(arg)); 
DoesItThrowException(doSomethingElse(arg1, arg2, arg3, arg4, arg5)); 
DoesItThrowException(doNothing()); 
+0

कैसे आप अगर विधि एक अपवाद फेंकता है देखने के लिए परीक्षण कर रहे हैं? यदि आप इसे 'try'-'catch' ब्लॉक में चिपकाने और इसे आमंत्रित करने की योजना बना रहे हैं, तो भी आपको इसे पैरामीटर प्रदान करना होगा। –

उत्तर

3
bool DoesItThrowException(Action a) 
{ 
    try 
    { 
    a(); 
    return false; 
    } 
    catch 
    { 
    return true; 
    } 
} 

DoesItThrowException(delegate { desomething(); }); 

//or 

DoesItThrowException(() => desomething()); 
10

आप इसे आह्वान नहीं कर सकते जब तक आप इसे तर्क देना; और जब तक आप हस्ताक्षर नहीं जानते हैं तब तक आप इसे तर्क नहीं दे सकते। इस के आसपास पाने के लिए, मैं फोन करने वाले पर कि बोझ डाल होगा - मैं अन्यथा Action और शीघ्र-तरीकों/lambdas, यानी

DoesItThrowException(FirstMethod); // no args, "as is" 
DoesItThrowException(() => SecondMethod(arg)); 
DoesItThrowException(() => ThirdMethod(arg1, arg2, arg3, arg4, arg5)); 

का प्रयोग करेंगे, तो आप Delegate और DynamicInvoke उपयोग कर सकते हैं, लेकिन यह धीमी है और आप की जरूरत है पता है कि इसे देने के लिए कौन सा तर्क है।

public static bool DoesItThrowException(Action action) { 
    if (action == null) throw new ArgumentNullException("action"); 
    try { 
     action(); 
     return false; 
    } catch { 
     return true; 
    } 
} 
+0

प्रश्न में दिखाए गए वाक्यविन्यास के साथ, यह स्पष्ट है कि लैम्ब्डा एकमात्र व्यवहार्य विकल्प है - वह वास्तव में एक प्रतिनिधि को इतना पास नहीं करना चाहता है ताकि सभी मानकों के साथ एक विधि बाध्य हो। –

+0

@ पावेल: इसके लिए आपको 'बेहतर' भाषा की आवश्यकता होगी, उदाहरण के लिए योजना, जो वाक्य रचनात्मक अमूर्तता की अनुमति देता है। – leppie

+0

क्यों 'बेहतर' और न केवल 'बेहतर'? योजना वास्तव में बेहतर है। –