2015-12-23 11 views
5

में कहा जाता है मैं इस तरह एक विधि कुछ है कॉल करने के लिए एक सामान्य तरीका है।वहाँ एक और तरीका है जब भी एक विधि सी #

मेरी समस्या यह है कि मुझे सेटअप() और TearDown() विधि कॉल के साथ इस प्रकार की विधि बार-बार लिखनी है।

संपादित करें: इस विधि का मुश्किल हिस्सा यह है कि "कुछ उपयोगी करें ..." केवल इस विधि के लिए विशिष्ट है। यह हिस्सा मेरे द्वारा बनाई गई हर विधि के लिए अलग है।

इसके अलावा, मेरे पास एक ही कक्षा में MyMethod2, MyMethod3 हो सकता है। सभी मामलों में, मैं सेटअप और टियरडाउन

क्या यह हर बार लिखने के बिना ऐसा करने का एक शानदार तरीका है?

शायद मैं भ्रमित हूं, लेकिन विधि में एक विशेषता जोड़ने और विधि कॉल को रोकने का एक तरीका है, इसलिए मैं कॉल से पहले और बाद में सामान कर सकता हूं?

+1

यह बहुत सारे प्रश्नों का एक डुप्लिकेट है। क्या आपने खोज करने की कोशिश की? आप प्रतिनिधियों, घटनाओं, सार तरीकों, पहलू उन्मुख प्रोग्रामिंग आदि का उपयोग कर सकते हैं। उदाहरण के लिए [कक्षा के सभी तरीकों से पहले एक विधि चलाएं] (http://stackoverflow.com/questions/9192709/run-a-method-before-all-methods-of-a-class), [तब बेस फ़ंक्शन कॉल करें) विरासत समारोह] (http://stackoverflow.com/questions/3747711/), [बुलाए गए फ़ंक्शन से पहले कोड निष्पादित करें] (http://stackoverflow.com/questions/10398530), [कोड ब्लॉक से पहले और बाद में विधि निष्पादित करें ] (http://stackoverflow.com/questions/26484206/) और इसी तरह। – CodeCaster

+2

आप आस्पेक्ट ओरिएंटेड प्रोग्रामिंग का उपयोग करना चाहते हैं। इसके लिए बहुत सारे उपकरण हैं। –

+1

धन्यवाद कोडकास्टर, लेकिन आपके द्वारा उल्लिखित पोस्टिंग में से कोई भी मेरे मामले में मदद नहीं करता है क्योंकि मेरे मामले में मेरे पास कई विधियों में से कई "MyMethods" हो सकते हैं, जिसमें विभिन्न विधि नाम, विभिन्न पैरामीटर और विभिन्न रिटर्न मान हैं। – Steven

उत्तर

2

है generics, lambdas और delegates का उपयोग करें:

public SomeThing MyMethod() 
{ 
    return Execute(() => 
    { 
     return new SomeThing(); 
    }); 
} 


public T Execute<T>(Func<T> func) 
{ 
    if (func == null) 
     throw new ArgumentNullException("func"); 

    try 
    { 
     Setup(); 

     return func(); 
    } 
    finally 
    { 
     TearDown(); 
    } 
} 
+0

यह शायद मैं जो सोच रहा था उसके सबसे नज़दीक है, लेकिन मुख्य बिंदु सेटअप/टियरडाउन को बार-बार लिखने के लिए हटा देना था। यह कोड इसे हटा देता है लेकिन कोड की अतिरिक्त परत जोड़ता है। – Steven

+0

यदि आप इस समस्या को हल करने के लिए विशेषताओं का उपयोग करना चाहते हैं तो आपको एओपी ढांचे को देखना चाहिए। –

6

बस इस तरह सार आधार वर्ग में इस विधि को लागू:

public Something MyMethod() 
{ 
    Setup(); 

    DoSomethingUsefull(); 

    TearDown(); 

    return something; 
} 

protected abstract DoSomethingUsefull(); 

अब आप विरासत में मिला कक्षाओं में केवल एक ही विधि ओवरराइड करने के लिए की जरूरत है - DoSomethingUsefull()

इस टेम्पलेट विधि पैटर्न

+2

टेम्पलेट पैटर्न - बहुत अच्छा। – dbugger

+0

हां, आप सही हैं - टेम्पलेट पैटर्न –

+3

आमतौर पर मैं इसी तरह के मामले में 'DoSomethingUseful' संरक्षित' कर दूंगा। – pmbanka

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