2012-02-24 12 views
15

मैं नीचे दिए गए कोड है और मैं एक प्रकार है जो भी स्ट्रिंग से निर्दिष्ट किया जाता है के लिए एक स्ट्रिंग बदलने की आवश्यकता होगी:एक Nullable प्रकार कौन सा क्रम में निर्धारित किया जाता है एक स्ट्रिंग में कनवर्ट करने के लिए कैसे?

Invalid cast from 'System.String' to 'System.Nullable`1[[System.DateTime, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]'. 

कैसे होगा कि:

Type t = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"); 

      object d = Convert.ChangeType("2012-02-23 10:00:00", t); 

मैं नीचे त्रुटि संदेश मिलता है अच्छी तरह से संभव हो?

मैं जानता हूँ कि एक बदसूरत तरीका है कि प्रकार नल है की जाँच करने के लिए उपयोग करता है, तो हो सकता है:

Type possiblyNullableType = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"); 

    var underlyingType = Nullable.GetUnderlyingType(possiblyNullableType); 

    Object result; 

    // if it's null, it means it wasn't nullable 
    if (underlyingType != null) 
    { 
     result = Convert.ChangeType("2012-02-23 10:00:00", underlyingType); 
    } 

कोई बेहतर तरीका होगा?

धन्यवाद,

उत्तर

29

दो समस्याएं हैं ।

सबसे पहले, Convert.ChangeType सादे नल प्रकार का समर्थन नहीं करता।

दूसरी बात, भले ही यह बॉक्सिंग द्वारा परिणाम (इसे object पर असाइन करें), आप इसे पहले से ही DateTime में परिवर्तित कर देंगे।

आप कर सकते थे विशेष मामले के नल प्रकार:

string s = "2012-02-23 10:00:00"; 
Type t = Type.GetType("System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]"); 
object d; 

if (t.IsGenericType && t.GetGenericTypeDefinition() == typeof(Nullable<>)) 
{ 
    if (String.IsNullOrEmpty(s)) 
     d = null; 
    else 
     d = Convert.ChangeType(s, t.GetGenericArguments()[0]); 
} 
else 
{ 
    d = Convert.ChangeType(s, t); 
} 
+0

आपको t.IsGenericType की जांच करने की आवश्यकता क्यों होगी? t.GetGenericTypeDefinition() == टाइपऑफ (Nullable <>) भाग उसको कवर करेगा; है ना? –

+2

@William 'GetGenericTypeDefinition()' एक अपवाद फेंकता है तो प्रकार साधारण नहीं है। – hvd

1

कुछ इस तरह? जब तक आपको इसे गतिशील रूप से करने की ज़रूरत नहीं है।

if (string.IsNullOrEmpty(input)) 
{ 
    return new DateTime?(); 
} 
else 
{ 
    return new DateTime?(DateTime.Parse(input)); 
} 

संभवतः आप देखने के लिए जाँच सकता है अगर आपके प्रकार 'नल' प्रकारों में से एक है और फिर शायद आपको यहां कुछ उपयोगी मिल सकता है:

Convert string to nullable type (int, double, etc...)

+0

मैं 'कर सकते हैं दिनांक दिनांक निर्दिष्ट नहीं है, यह रनटाइम पर निर्धारित है। –

+0

'नई दिनांक समय वापसी();?' 'वापसी अशक्त द्वारा प्रतिस्थापित किया जाना चाहिए,'। – ken2k

+0

शायद आप आप के रूप में आप वर्तमान में क्या कर रहे हैं हम आपको सलाह देंगे सकता है करने का विरोध करने के लिए कोशिश कर रहे हैं के बारे में कुछ और जानकारी की आपूर्ति कर सकते हैं? – Paddy

9

मैंने लिखा नीचे सामान्य सहायक विधि है जो सबसे परिदृश्यों (सामान्य प्रकार के साथ परीक्षण नहीं) में काम करता है:

static void Main(string[] args) 
{ 
    Object result = 
     ConvertValue(
      "System.Nullable`1[[System.DateTime, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]", 
      "2012-02-23 10:00:00"); 
} 

public static Object ConvertValue(string typeInString, string value) 
{ 
    Type originalType = Type.GetType(typeInString); 

    var underlyingType = Nullable.GetUnderlyingType(originalType); 

    // if underlyingType has null value, it means the original type wasn't nullable 
    object instance = Convert.ChangeType(value, underlyingType ?? originalType); 

    return instance; 
} 
+0

धन्यवाद। यह सबसे सुरुचिपूर्ण और कामकाजी समाधान है। –

2
public static T GetValue<T>(string Literal, T DefaultValue) 
    { 
     if (Literal == null || Literal == "" || Literal == string.Empty) return DefaultValue; 
     IConvertible obj = Literal; 
     Type t = typeof(T); 
     Type u = Nullable.GetUnderlyingType(t); 

     if (u != null) 
     { 
      return (obj == null) ? DefaultValue : (T)Convert.ChangeType(obj, u); 
     } 
     else 
     { 
      return (T)Convert.ChangeType(obj, t); 
     } 
    } 
संबंधित मुद्दे