2008-12-26 21 views
31

मैं निम्नलिखित कोड है के साथ काम करने लगता है। मैं इसे Guid कन्वर्ट करने के लिए सक्षम होने के लिए चाहते हैं, लेकिन मैं त्रुटि मिलती रहती है:जेनेरिक रूपांतरण समारोह GUIDs

Invalid cast from System.String to System.Guid

यह आदिम डेटा प्रकार के साथ पूरी तरह से काम करता है।
क्या पर कोई तरीका नहीं है गैर-आदिम डेटा प्रकार के लिए यह काम करें?

उत्तर

82

कैसे के बारे में: Guid के लिए

T t = (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFromInvariantString(text); 

वर्क्स ठीक है और अधिकांश अन्य प्रकार।

+4

ConvertFromInvariantString उपयोग करने के साथ सावधान रहें। यदि आपका प्रकार डेटटाइम है और आपके पास अंतरराष्ट्रीय दिनांक प्रारूप हैं, तो यह उड़ाएगा। मैंने इस जवाब के आधार पर वास्तव में एक कठिन-से-खोजने वाली बग को ट्रैक किया। –

+0

@DPeden वास्तव में, उन्हें मेल खाना चाहिए - मेरा उपयोग यहां धारणा का उपयोग कर रहा था कि धारावाहिक डेटा आमतौर पर एक परिवर्तनीय प्रारूप –

+0

हाँ में होना चाहिए, सहमत है। मैंने अभी भी आपका जवाब ऊपर उठाया क्योंकि यह बहुत उपयोगी है। बस इस जलाशय को दूसरों के लिए इंगित करते हुए मुझे जला दिया। –

0

इस प्रयास करें:

public object ChangeType(object value, Type type) 
    { 
     if (value == null && type.IsGenericType) return Activator.CreateInstance(type); 
     if (value == null) return null; 
     if (type == value.GetType()) return value; 
     if (type.IsEnum) 
     { 
      if (value is string) 
       return Enum.Parse(type, value as string); 
      else 
       return Enum.ToObject(type, value); 
     } 
     if (!type.IsInterface && type.IsGenericType) 
     { 
      Type innerType = type.GetGenericArguments()[0]; 
      object innerValue = ChangeType(value, innerType); 
      return Activator.CreateInstance(type, new object[] { innerValue }); 
     } 
     if (value is string && type == typeof(Guid)) return new Guid(value as string); 
     if (value is string && type == typeof(Version)) return new Version(value as string); 
     if (!(value is IConvertible)) return value; 
     return Convert.ChangeType(value, type); 
    } 
संबंधित मुद्दे