2009-12-07 71 views
0

我想用System.ComponentModel.TypeConverter來將一堆System.Strings強制轉換爲不同的類型。這些字符串可能是或者可能不是TypeConverter的有效格式,所以我想在嘗試類型轉換之前找到一種方法來檢查它們的有效性(以避免必須依靠捕獲System.FormatException來指示String格式不正確)。C#TypeConverters和IsValid

很好,這就是爲什麼TypeConverters有一個IsValid()方法,對吧?那麼我遇到了IsValid()將返回true的問題,但是當我調用ConvertFromString()時,它會引發異常。下面是一些代碼來重現問題:

 System.ComponentModel.DateTimeConverter DateConversion = 
      new System.ComponentModel.DateTimeConverter(); 

     String TheNumberZero = "0"; 

     if (DateConversion.IsValid(TheNumberZero)) 
      Console.WriteLine(DateConversion. 
       ConvertFromString(TheNumberZero).ToString()); 
     else 
      Console.WriteLine("Invalid."); 

當我運行此,該行

Console.WriteLine(DateConversion. 
    ConvertFromString(TheNumberZero).ToString()); 

拋出與消息

0 is not a valid value for DateTime. 

一個System.FromatException是什麼目的IsValid()方法是否在嘗試類型轉換之前檢查轉換輸入?有什麼方法可以檢查字符串的有效性嗎?不必捕捉FormatException?

回答

3

該文檔是您的朋友:

所述的IsValid方法用於驗證 值的類型,而不是 內確定是否值可以轉換爲 給定類型。例如,可以使用IsValid 來確定給定的 值是否對於枚舉類型 有效。有關示例,請參閱 EnumConverter。

您可以編寫自己的 WillConvertSucceed方法,將 的ConvertTo和ConvertFrom方法 用於異常塊。

+2

另見https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=93559 –

+0

這是否意味着沒有辦法,而不訴諸異常處理的時間提前算出這個? – brian

+0

另外,很棒的鏈接,謝謝Pavel – brian

0

聽起來像Int32上的TryParse,日期時間,小數等等可能會更有用一些。

1

這是ck提出的代碼示例。
通常,當您實際需要知道值類型的解析是否可以工作時,這是使用的方法。

 DateTime convertedDate; 
     string zero = "0"; 

     if (!DateTime.TryParse(zero, out convertedDate)) 
     { 
      throw new InvalidCastException(string.Format(
       "Attempted Invalid Cast of {0} to DateTime",zero)); 
     }