2012-09-25 31 views
24

मुझे एक विधि में एक सामान्य प्रकार कनवर्टर फ़ंक्शन भेजना पसंद है लेकिन मैं यह नहीं समझ सकता कि इसे कैसे किया जाए।मैं सामान्य प्रकार पैरामीटर के साथ एक func में कैसे जा सकता हूं?

public void SomeUtility(Func<T><object,T> converter) 
{ 
    var myType = converter<MyType>("foo"); 
} 

संपादित करें (टिप्पणी में भी मेरी चर्चा देखें:

यहाँ अवैध वाक्य रचना बताते हैं कि मैं क्या हासिल करना, समस्या मैं अपने समारोह के साथ एक साथ सामान्य प्रकार निर्दिष्ट करने के लिए कैसे पता नहीं है है की तरह है लॉरेंस) के साथ: द्वारा "सामान्य प्रकार कनवर्टर" मैं मतलब मैं, एक कनवर्टर है कि किसी भी मजबूत प्रकार < टी > (आपत्ति नहीं) करने के लिए परिवर्तित कर सकते हैं में पारित करने के लिए तो मेरे विधि में अगली पंक्ति हो सकता है चाहते हैं:

var myOtherType = converter<MyOtherType>("foo"); 

प्रतिनिधि मुझे पी पसंद है गधा के रूप में एक पैरामीटर कुछ इस तरह दिखेगा:

private delegate TOutput myConverterDelegate<TOutput>(object objectToConvert); 

यह अधिक है एक वाक्य रचना/सी # अन्वेषण अब, किया मैं शायद बजाय एक इंटरफ़ेस का उपयोग करेगा चीजें पाने के लिए है, लेकिन मुझे उम्मीद है कि इस एक के साथ पूरा करने के लिए संभव है करना समारोह/प्रतिनिधि।

+0

क्या तथ्य है कि आपने विधि निकाय के अंदर एक प्रकार निर्दिष्ट किया है? क्या आप इस विधि को कॉलर द्वारा परिभाषित एक विशिष्ट प्रकार के बजाय कई प्रकार के विरुद्ध रूपांतरण करने की आवश्यकता हो सकती है? –

+0

हां, यही वह था जिसे मैंने "सामान्य प्रकार कनवर्टर" के रूप में व्यक्त करने की कोशिश की थी, इसलिए अगली पंक्ति varOtherType = कनवर्टर ("foo") हो सकती है; – joeriks

+0

ठीक है - तो मुझे लगता है कि आपको मेरा जवाब उपयोगी लगेगा :) –

उत्तर

19

आप सामान्य कार्य या कार्यों के उदाहरण नहीं हो सकता है - सभी प्रकार पैरामीटर अग्रिम परिभाषित कर रहे हैं और कॉल करने वाले को नए सिरे से परिभाषित नहीं किया जा सकता।

एक आसान तरीका नीचे कास्टिंग पर निर्भर द्वारा पूरी तरह बहुरूपता से बचने के लिए होगा:

public void SomeUtility(Func<Type, object, object> converter) 
{ 
    var myType = (MyType)converter(typeof(MyType), "foo"); 
} 

आप टाइप सुरक्षा चाहते हैं तो आपको फोन करने वाले के लिए प्रकार पैरामीटर की परिभाषा को स्थगित करने की जरूरत है।

public void SomeUtility(IConverter converter) 
{ 
    var myType = converter.Convert<MyType>("foo"); 
} 

interface IConverter 
{ 
    T Convert<T>(object obj); 
} 

संपादित करें::

'कनवर्टर प्रकार' कॉल-स्थल पर जाना जाता है, और केवल इस प्रकार के अंदर इस्तेमाल किया जाएगा आप एक इंटरफेस के भीतर एक सामान्य विधि रचना करके ऐसा कर सकते उपयोगिता विधि, फिर आप विधि पर एक सामान्य प्रकार को परिभाषित कर सकते हैं और इसका उपयोग कर सकते हैं, जैसे कि अन्य पोस्टर्स ने सुझाव दिया है।

+0

ठीक है धन्यवाद, हाँ, मैं शायद उस दिशा में इंगित करने के लिए धन्यवाद, एक इंटरफ़ेस का उपयोग करूंगा। लेकिन, ब्याज से, एक प्रतिनिधि/एक func एक सामान्य प्रकार को पारित करने में सक्षम नहीं होना चाहिए? एक प्रतिनिधि के रूप में वर्णित मुझे लगता है कि मैं इसे लिखूंगा: निजी प्रतिनिधि ट्यूटपूट myConverterDelegate (ऑब्जेक्ट ऑब्जेक्ट टू कन्वर्ट); - लेकिन जब मैं इसे पैरामीटर के रूप में उपयोग करने का प्रयास करता हूं तो मुझे "1 प्रकार के तर्कों की आवश्यकता होती है" – joeriks

+1

आप निश्चित रूप से * जेनेरिक प्रतिनिधियों को परिभाषित कर सकते हैं, आखिरकार फनक और एक्शन क्या हैं। जेनेरिक इंटरफेस और कक्षाओं की तरह, उन्हें * जेनेरिक परिभाषा * के रूप में माना जाता है। हालांकि, आप विधि संकेतों में * सामान्य परिभाषा * का उपयोग नहीं कर सकते हैं, केवल पैरामीटर * जेनेरिक प्रकार *। काफी सरलता से आप ऐसा नहीं कर सकते जो आप अकेले एक प्रतिनिधि के साथ हासिल करने की कोशिश कर रहे हैं। –

7

आपको SomeUtility जेनेरिक भी बनाना होगा। ऐसा करने से और वाक्य रचना फिक्सिंग देता है:

public void SomeUtility<T>(Func<object,T> converter) 
{ 
    var myType = converter("foo"); 
} 
15
public void SomeUtility<T>(Func<object, T> converter) 
{ 
    var myType = converter("foo"); 
} 

और उसके बाद:

SomeUtility(arg => new MyType()); 

सामान्य प्रकार निष्कर्ष इस मामले में काम करेंगे।

+0

यह स्वीकार किया जाना चाहिए –

3

आपको इसे उपयोग करने के लिए संकलन-समय पर टी प्रकार को जानना होगा। टी को कक्षा-स्तर या विधि-स्तर पर निर्दिष्ट किया जा सकता है।

class SomeClass<T> { 
    public void SomeUtility(Func<object, T> converter) { 
     var myType = converter("foo"); // Already is the T-type that you specified. 
    } 
} 

या

public void SomeUtility<T>(Func<object, T> converter) { 
    var myType = converter("foo"); // Already is the T-type that you specified. 
} 

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

  • कोई संबंधित समस्या नहीं^_^