2011-07-25 39 views
5

पर कॉल करें, मैं वर्तमान में एक मौजूदा डीएएल का पुन: उपयोग कर रहा हूं जिसमें उपयोगकर्ता कॉल और एक आंतरिक वर्ग है जो वास्तविक कार्य को ADO.Net प्रदाता पर निर्भर करता है। SqlProvider, और मैं यह सुनिश्चित करें कि कोड सूखी है कोशिश कर रहा हूँ, मैं एक समारोह का उपयोग करके ठीक किया है तो मैं कर सकते हैं:सी # आउट पैरामीटर के साथ जेनेरिक प्रतिनिधि - परिभाषित करें और

return RunCommand(c => c.ExecuteNonQuery(commandText, parameters)); 

और RunCommand विधि की तरह दिखता है:

private T RunCommand<T>(Func<Commands, T> toRun) 
    { 
     return toRun(CreateCommand()); 
    } 

CreateCommand() विधि बस उपयोग करने के लिए कमांड ऑब्जेक्ट बनाता है, तो यह मुझे एक ऐसी विधि रखने की अनुमति देती है जो सभी कॉलों को संभालती है जो केवल अपेक्षित प्रकार को वापस कर देती हैं जैसे कि डेटासेट, DataReader, आदि

समस्या मेरे पास है कि मुखौटा पर कई कॉल करता है, तो मैं एक प्रतिनिधि उपयोग कर सकते हैं एक out पैरामीटर मैं सक्षम होना चाहिए पता दोहराया कोड निकालने प्रदान करना है लेकिन & googling के एक बहुत बाद प्रयोग मैंने कैसे काम करने में कामयाब नहीं रहे। कोड है:

Commands commands = CreateCommand(); 
return commands.ExecuteNonQuery(out cmd, commandText, parameters); 

क्या मैं सच में करना चाहते हैं फोन करने में सक्षम हो रहा है:

return RunCommand(c => c.ExecuteNonQuery(out cmd, commandText, parameters)); 

मैं मौजूदा प्रश्न this को देखा है लेकिन मुझे के जीवन के लिए मैं कैसे बाहर काम नहीं कर सकता मुझे जो चाहिए उसे बदलने के लिए।

इस प्रतिनिधि प्रतीत होता है कि मैं क्या private delegate V TestOutParameter<T, U, V>(T a, out U b, V c); की जरूरत होने के लिए, लेकिन कोड मैं इसे फोन करने के लिए मिल गया है सिर्फ सही नहीं है:

private V RunCommand<T, U, V>(TestOutParameter<Commands, DbCommand, V> commandToExecute) 
    { 
     DbCommand cmd; 
     return (V)commandToExecute(CreateCommand(), out cmd); 
    } 

किसी को भी मेरी मदद कर सकते के रूप में यह मेरे लिए एक के लिए पागल गाड़ी चला कर दिया गया है सप्ताह!

उत्तर

11

आपके प्रतिनिधि के दो में से तीन पैरामीटर हैं। मान लें कि आप यह समारोह दर्पण करना चाहते हैं, के बजाय:

private delegate V TestOutParameter<T, U, V>(T a, out U b, V c); 

आप होना चाहिए:

private delegate V TestOutParameter<T, U, V>(T a, out U b); 

मैं व्यक्तिगत रूप से सुझाव है कि आप की तरह कुछ करने के लिए इसका नाम बदलना होगा:

private delegate TResult FuncOut<T1, T2, TResult>(T1 arg1, out T2 arg2) 
+0

कि प्रतिनिधि परिपूर्ण बनाता है भावना, जो महान है। हालांकि मैं अभी भी अपने सिर को खरोंच कर रहा हूं कि मैं इसे कैसे बुलाता हूं। टी 1 वह वर्ग है जिस पर मुझे वास्तविक विधि को कॉल करने की आवश्यकता है और उस पर आउट पैरामीटर है। टीबीएच मैं इसे कॉल करने के तरीके के रूप में खो गया हूँ। – Nathan

+0

@ नाथन: प्रतिनिधि प्रकार में परिवर्तन को आपके 'रनकॉमैंड' कोड को किसी समस्या के साथ संकलित नहीं करना चाहिए, जब तक कि 'CreateCommand' विधि' कमांड 'लौटाती है। –

+0

यह वह जगह है जहां मैं असफल रहता हूं :) 'रनकॉमैंड' कोड खुश है, लेकिन जब मैं 'रिटर्न रनकॉमैंड (सी => सी। एक्सेक्यूट नॉनक्वायर (आउट cmd, कमांडटेक्स्ट, पैरामीटर) का उपयोग करने का प्रयास करता हूं);' मुझे बताया जा रहा है वीएस कि "रेफरी या आउट पैरामीटर का उपयोग नहीं कर सकता"। मुझे लगता है कि मैं विधि को कॉल करने के लिए सही वाक्यविन्यास का उपयोग नहीं कर रहा हूं? – Nathan

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