2013-05-28 9 views
9

पर ऑब्जेक्ट कास्ट करें, मैंने थोड़ी देर में सोया नहीं है, इसलिए मुझे लगता है कि यह संभवतः आसान है।एक सामान्य प्रकार

मैं एक सामान्य वर्ग है कि राशि कम या ज्यादा यह:

public class Reference<T> where T : APIResource //<- APIResource is abstract btw 
{ 
    private T _value = null; 
    public T value 
    { 
     get { return _value; } 
    } 
} 

कहीं और, एक कस्टम serialize विधि में, किसी को एक object वास्तव में Reference<(something)> का एक उदाहरण है कि में गुजर रहा है। मैं बस "मूल्य" संपत्ति हर Reference<> वस्तु है कि करने के लिए छोड़ना चाहते, तो मैं जाना चाहता हूँ:

:

string serialize(object o) 
{ 
    return base.serialize(((Reference<>) o).value); 
} 
बेशक

, जीवन इतना आसान संकलक कहते हैं क्योंकि के रूप में नहीं है using the generic type "Reference<T>" requires 1 type arguments

मैं क्या कर सकता हूं जो मैं करना चाहता हूं?

interface IReference<out T> where T : ApiResource { 
    T Value { get; } 
} 

फिर आप IReference<object> या IReference<ApiResource> करने के लिए IReference<Anything> डाली कर सकते हैं:

उत्तर

14

आप संपत्ति के साथ एक covariant सामान्य इंटरफ़ेस बना सकते हैं।

+0

मैं कॉन्वेंट जेनेरिक इंटरफेस के बारे में बिल्कुल कुछ नहीं जानता था इसलिए मैं वास्तव में खुश हूं कि मैं एसओ में बदल गया। मुझे जेनेरिक क्लास को तदनुसार संशोधित करना था: 'पब्लिक क्लास रेफरेंस : आईरिएफर जहां टी: एपीआईआरसोर्स {...} '। यह मुझे मूल्य संपत्ति को पुनः प्राप्त करने की अनुमति देता है ((आईरिएफर ) ओ)। वैल्यू – Alain

3

SLaks उत्तर सही है। मैं बस इसे थोड़ा सा विस्तार करना चाहता हूं:

कभी-कभी स्थितियां होती हैं, जहां आप इंटरफ़ेस के साथ कक्षा को प्रतिस्थापित नहीं कर सकते हैं।

string serialize(object o) 
{ 
    if(typeof(Reference<>) == o.GetType().GetGenericTypeDefinition()) 
     return base.serialize(((dynamic)o).value); 

    //in your case you will throw InvalidCastException 
    throw new ArgumentException("not a Reference<>", "o"); 
} 

यह सिर्फ एक और विकल्प है और मैं इसे बहुत सावधानी से उपयोग करने के लिए सुझाव देते हैं: केवल कि मामलों में आप ताकि आप value संपत्ति कॉल कर सकते हैं, dynamic सुविधा का उपयोग कर सकते हैं।

+0

विकल्प के लिए धन्यवाद। स्पष्ट रूप से यह एक आखिरी उपाय है, लेकिन अगर कोई सामान्य प्रश्न में सामान्य वर्ग को संशोधित नहीं कर सकता है तो यहां बहुत महत्वपूर्ण है। – Alain

1

न इसके जेनेरिक प्रकार किया जाए या नहीं ---> o.GetType()। IsGenericType,

o.GetType()। GetGenericTypeDefinition (का उपयोग करते हुए) और यह अपवाद फेंकता से पहले .. जाँच करने के लिए भूल जाते हैं

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