2013-10-21 12 views
10

मेरे पास कक्षा है जो एक्सेल फ़ाइल में कई समान अभी तक अलग-अलग पढ़ने/लिखने के संचालन करती है। इन सभी कार्यों को अलग-अलग कार्यों में परिभाषित किया गया है। उन्हें सभी को कोड के एक ही लंबे ब्लॉक के भीतर निहित होना चाहिए (कोड जो फ़ाइल को चेक करता है और खोलता है, बचाता है, बंद करता है, आदि)। हर बार इस कोड को डुप्लिकेट करने का उचित तरीका क्या है? समस्या यह है कि मैं प्रत्येक विधि के लिए अलग कोड को निष्पादित करने से पहले सभी साझा कोड वाले एक विधि को नहीं कर सकता क्योंकि उस कोड को साझा करने के लिए, कोशिश करने और साझा कोड के बयान के लिए कई परतों में निहित होना चाहिए ।vb.net में पैरामीटर के रूप में कार्य पास करें?

क्या फ़ंक्शन को पैरामीटर के रूप में पास करना संभव है, और उसके बाद उस फ़ंक्शन को साझा कोड के अंदर चलाएं? या क्या इसे संभालने का एक बेहतर तरीका है?

+0

संभावित डुप्लिकेट [विधि नाम को वीबीएनईटी में प्रक्रिया के पैरामीटर के रूप में कैसे पास करें] (http://stackoverflow.com/questions/8697504/how-to-pass-methodname-as-parameter-of-a-procedure- इन-वीबीनेट) – mbomb007

उत्तर

3

तुम भी एक delegate ताकि आप पास कर सकते हैं समारोह/बाद के चरणों एक निश्चित हस्ताक्षर है कि उपयोग कर सकते हैं।

3

अपने पैरामीटर को Func(Of T) या Action(Of T) के रूप में घोषित करें।

आपको कौन सा उपयोग करना चाहिए, अपने तरीकों के हस्ताक्षर पर निर्भर करता है। यदि आपने हमें एक दिया तो मैं आपको अधिक सटीक उत्तर दे सकता हूं। वास्तविक सवाल पर

+0

अगर मैं Func के रूप में घोषित करता हूं, तो मुझे त्रुटि मिलती है "टाइप func परिभाषित नहीं किया गया है"। अगर मैं एक्शन के रूप में घोषित करता हूं, तो मुझे त्रुटि मिलती है "सिस्टम.एक्शन (टी के) में कुछ प्रकार के तर्कों के लिए"। कुछ विधियों जो मैं पास करूंगा वे कार्य हैं, उनमें से कुछ subs subs हैं। –

+0

उन्हें 'फनक (टी)' या 'एक्शन (टी)' का उपयोग करने के लिए एक ही हस्ताक्षर होना चाहिए। – MarcinJuraszek

+1

इसका क्या अर्थ है? –

22

केंद्रित:

यह एक पैरामीटर

हाँ के रूप में एक समारोह के पारित करने के लिए संभव है। विधि को किसी अन्य विधि में पास करने के लिए AddressOf TheMethod का उपयोग करें। तर्क प्रकार एक प्रतिनिधि होना चाहिए जिसका हस्ताक्षर लक्ष्य विधि से मेल खाता है। विधि के अंदर, आप पैरामीटर का इलाज करते हैं जैसे कि यह वास्तविक विधि थी। उदाहरण:

Sub Foo() 
    Console.WriteLine("Foo!") 
End Sub 

Sub Bar() 
    Console.WriteLine("Bar!") 
End Sub 

Sub CallSomething(f As Action) 
    f() 
End Sub 

' … somewhere: 
CallSomething(AddressOf Foo) 
CallSomething(AddressOf Bar) 

जैसा कि मैंने कहा, वास्तविक पैरामीटर प्रकार उस विधि के हस्ताक्षर पर निर्भर करता है जिसे आप पास करना चाहते हैं। या तो Action(Of T) या Func(Of T) या एक कस्टम प्रतिनिधि प्रकार का उपयोग करें।

हालांकि, कई मामलों में यह वास्तव में उचित एक प्रतिनिधि के बजाय एक इंटरफ़ेस का उपयोग करने के लिए, विभिन्न वर्गों अपने इंटरफ़ेस को लागू कर दिया है, और अपने विधि में उन विभिन्न वर्गों की वस्तुओं गुजरती हैं।

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