2010-09-05 20 views
8

के साथ समर्थन करता है, कल्पना कीजिए कि आपको दो सिस्टम दिए गए हैं। टाइप करें और आप यह निर्धारित करना चाहते हैं कि एक से दूसरे में एक अंतर्निहित या स्पष्ट प्रकार का रूपांतरण है या नहीं।जांचना कि कोई प्रकार किसी अन्य प्रकार के निहित या स्पष्ट प्रकार रूपांतरण को .NET

विशेष रूप से स्थैतिक तरीकों की जांच किए बिना यह निर्धारित करने के लिए एक अंतर्निहित विधि है कि प्रकार या तो इन रूपांतरणों का समर्थन करता है?

मुझे पता है कि यह एक प्रश्न के लिए एक संक्षिप्त निकाय है, लेकिन मुझे लगता है कि परिदृश्य समझाया जा सकता है, अगर मुझे नहीं पता है।

अग्रिम धन्यवाद, स्टीफन।

+0

'टाइप रूपांतरण' से आपका क्या मतलब है - 'टाइप कनवर्टर' अर्थ में उदाहरणों या परिवर्तनीयता की असाइननीयता? –

+0

विशेष रूप से सी # लिखित निहित/स्पष्ट ऑपरेटरों (http://msdn.microsoft.com/en-us/library/z5z9kes2(VS.71).aspx और http://msdn.microsoft.com/en-us/ देखें लाइब्रेरी/xhbhezf4 (VS.71) .aspx) – meandmycode

+0

संभावित डुप्लिकेट [कैसे जांचें कि स्पष्ट या स्पष्ट कास्ट मौजूद है?] (http://stackoverflow.com/questions/1815452/how-to-check-if-implicit- या-स्पष्ट-कास्ट-मौजूद है) – nawfal

उत्तर

8

Expression.Convert उपयोगकर्ता द्वारा परिभाषित रूपांतरण ऑपरेटर की तलाश कर सकते हैं, लेकिन दुर्भाग्य से यदि कोई भी नहीं मिला तो यह केवल अपवाद फेंक देगा। आप इसे इस तरह इस्तेमाल कर सकते हैं:

public static bool CanConvert(Type fromType, Type toType) 
{ 
    try 
    { 
     // Throws an exception if there is no conversion from fromType to toType 
     Expression.Convert(Expression.Parameter(fromType, null), toType); 
     return true; 
    } 
    catch 
    { 
     return false; 
    } 
} 
+0

धन्यवाद क्वार्टरमेस्टर यह निश्चित रूप से एक समाधान है! – meandmycode

+2

@meandmycode: यदि आप अपवाद के ओवरहेड के बिना एक ही चीज़ को कार्यान्वित करना चाहते हैं, तो आप अभिव्यक्ति पर प्रतिबिंबित कर सकते हैं। यह देखने के लिए बदलें कि यह वास्तव में क्या करता है। दिलचस्प तरीके हैं IIdentityPrimitiveOrNullableConversion, HasReferenceConversion, और GetUserDefinedCoercionMethod System.Dynamic.Utils.TypeUtils में। – Quartermeister

+0

अच्छा, अनुसंधान प्रयास के लिए धन्यवाद, मैं आपके सुझाए गए कोड से बचने के खिलाफ पूरी तरह से नहीं हूं, भले ही मैं TypeUtils जैसी विधियों को लागू करता हूं, यह अपवाद को पकड़ने के बजाय इसे बनाए रखने के लिए और अधिक काम करने के लिए समाप्त हो सकता है। – meandmycode

0

आप अन्य करने के लिए हर एक कास्टिंग और अपवाद

+0

दुर्भाग्य से मेरे पास केवल ऑब्जेक्ट तक पहुंच है, न कि वास्तविक वस्तुएं, इसलिए मैं ऐसा करने में सक्षम नहीं हूं। – meandmycode

0

पकड़ने की कोशिश कर सकते मुझे लगता है कि Type.IsAssignableFrom आपको क्या चाहिए तुम्हें देना चाहिए।

[संपादित करें] ध्यान दें कि यह रूपांतरण ऑपरेटरों पर विचार नहीं करता है, इसलिए यह संभव है कि यह आपके लिए उपयोगी न हो। वैसे भी उल्लेख करने लायक है।

+0

यह किसी भी कस्टम रूपांतरण ऑपरेटर को ध्यान में नहीं रखेगा। यह केवल प्रकार पदानुक्रम को देखता है। – driis

+0

मुझे यकीन नहीं है कि यह अंतर्निहित/स्पष्ट प्रकार रूपांतरण ऑपरेटर को संभालता है जिसे आप सी # के साथ परिभाषित कर सकते हैं। उदाहरण के लिए यदि मैं टाइपऑफ (एक्सनाम) लिखता हूं IsAssignableFrom (टाइपऑफ (स्ट्रिंग)) मुझे झूठा लगता है। लेकिन XName स्ट्रिंग से एक अंतर्निहित प्रकार रूपांतरण है। – meandmycode

7

मुझे ऐसा नहीं लगता है। आप प्रतिबिंब का उपयोग करेंगे और उन अच्छे ओल 'op_Implicit और op_Explicit प्रत्येक प्रकार के स्थैतिक तरीकों के लिए देखेंगे। जो एक बड़ा प्रदर्शन प्रभाव, प्रतिबिंब (इस उत्तर) या नियंत्रण प्रवाह (Quartermeister's) के लिए अपवाद का उपयोग कर दिया गया है:

यह बहुत दिलचस्प सवाल लाता है? मैं ईमानदारी से अनुमान नहीं लगा सका। आप प्रत्येक को प्रोफाइल करना और खुद के लिए खोजना चाह सकते हैं।

+0

ईप, शायद यह इतनी बुरी चीज नहीं है, मुझे चिंता थी कि इन विशेष नामित विधियों की तलाश नाजुक थी, लेकिन दूसरी ओर मैं कभी भी इन विधि नामों को बदलने की उम्मीद नहीं करता! – meandmycode

+0

@meandmycode: हाँ, मुझे यकीन नहीं है कि वे वास्तव में निर्दिष्ट हैं या नहीं; लेकिन मैं उन लोगों के बारे में सोचता हूं जो गुणों के लिए 'get_' और' set_' विधियों के रूप में हैं - * बहुत * बदलने की संभावना नहीं है (हालांकि मैं इस तरह के "हुड के नीचे" आपकी असुविधा साझा करता हूं)। –

+0

मैं 100% निश्चित नहीं हूं लेकिन करीब हूं :) मुझे लगता है कि आप कुछ तरीकों से रूपांतरणों को याद करेंगे यदि आप केवल इन तरीकों की तलाश कर रहे हैं जैसे int से लंबे और आधार/इंटरफ़ेस से व्युत्पन्न। शिच समाधान की नाजुकता में वृद्धि करेगा क्योंकि विधि के नाम को बदलने के अलावा अन्य परिवर्तनों में तोड़ने वाला परिवर्तन –

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