2016-02-25 14 views
6

पर ऑब्जेक्ट कास्ट करें यह एक त्रुटि उत्पन्न करता है कि मैं टाइप ClassType से T को परिवर्तित नहीं कर सकता। क्या इसके समाधान की कोई युक्ति है?विधि जेनेरिक प्रकार

वहाँ कि thisके प्रकार वास्तव मेंT में बदला जा सकता निर्दिष्ट करने के लिए कोई तरीका है?

public void WorkWith<T>(Action<T> method) 
{ 
    method.Invoke((T)this); 
} 

उत्तर

3

दो संभव समाधान:

typesafe नहीं:

public void WorkWith<T>(Action<T> method) 
{ 
    method.Invoke((T)(object)this); 
} 

यह typesafe नहीं है क्योंकि आप इसे किसी भी तरीके से एक एकल पैरामीटर और कोई वापसी है कि पारित कर सकते हैं मान, जैसे:

WorkWith((string x) => Console.WriteLine(x)); 

typesafe "संस्करण" (सामान्य बाधाओं का प्रयोग करके):

public class MyClass 
{ 
    public void WorkWith<T>(Action<T> method) where T : MyClass 
    { 
     method.Invoke((T)this); 
    } 
} 

यहां मुद्दा यह है कि T को this कास्ट करने के लिए सक्षम होने के लिए है, संकलक सुनिश्चित करें कि this हमेशा T को castable है बनना चाहता है (ताकि जरूरत बाधा के लिए)। जैसा कि प्रकार-सुरक्षित-सुरक्षित उदाहरण में दिखाया गया है, जेनेरिक के साथ उपयोग किए जाने वाले "शास्त्रीय" (असुरक्षित) समाधान को object पर कास्ट से गुजर रहा है।

+0

हालांकि नीचे उपयोगकर्ता गलत जवाब हो सकता था, यह अस्पष्ट था इसलिए मैंने इसे संपादित किया है और स्वीकार किए जाते हैं। यह उत्तर भी बहुत अच्छा है क्योंकि यह संदिग्ध नहीं था और परिणाम को स्पष्टीकरण के संदर्भ में दिखाता है। मैं दोनों को स्वीकार करना चाहता हूं लेकिन ओह ठीक है। – KthProg

+0

upvoted और एक जवाब जो मूल रूप से गलत है और कोई स्पष्टीकरण नहीं ... –

+0

@ Selman22 मैं मूल पोस्टर के लिए बुरा लग रहा है, लेकिन मैं सहमत होना होगा शामिल की तुलना में इस सवाल का जवाब में स्वीकार किया जाना चाहिए। बदला हुआ। – KthProg

3
public void WorkWith<T>(Action<T> method) where T: ClassType { 
    method.Invoke((T)this); 
} 
+0

धन्यवाद! मुझे यकीन नहीं था कि विधियों के लिए टेम्पलेट प्रकारों को कैसे प्रतिबंधित किया जाए! – KthProg

+0

तुम्हारा स्वागत –

+0

, किसी भी विचार कई संभव वर्गों है कि सभी 'class' से निकाले जाते हैं निर्दिष्ट करने के लिए कैसे जब आप यहां हैं कर रहे हैं? 'टी कहां:' के बाद सूचीबद्ध कई वर्ग इसे तोड़ने लगते हैं। – KthProg

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