2011-11-22 62 views
5

(已解決)我正在構建一個應用程序,它可以根據XML文件的一些描述動態地創建一些控件。
我現在需要的是與TryParse()方法非常相似的東西:如果字符串變量中的文本可以轉換(或解析)爲類型,則可以檢查(不拋出/捕獲異常)其他變種(myType)。
問題是,myType可以是任何.NET類型:DateTime, Bool, Double, Int32測試字符串是否可以轉換爲其他各種類型

例子:

string testStringOk = "123"; 
string testStringWrong = "hello"; 
string myType = "System.Int32"; 

bool test1 = CanCovertTo(testStringOk, myType);  //true 
bool test2 = CanCovertTo(testStringWrong, myType); //false 

如何CanCovertTo(string testString, string testType)功能應該是什麼樣子?

我得到的最接近的是下面的代碼:

private bool CanCovertTo(string testString, string testType) 
{ 
    Type type = Type.GetType(testType, null, null); 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 

    converter.ConvertFrom(testString); //throws exception when wrong type 
    return true; 
} 

然而,它拋出一個異常,而試圖從錯誤的字符串轉換,我不喜歡使用try {} catch()了點。


解決方案:

private bool CanCovertTo(string testString, string testType) 
{ 
    Type type = Type.GetType(testType, null, null); 
    TypeConverter converter = TypeDescriptor.GetConverter(type); 
    return converter.IsValid(testString); 
} 
+1

爲什麼你不希望使用try/catch? – PVitt

+1

你爲什麼試圖在一個名爲CanConvert的函數中轉換一個值?你不能只做「return converter.CanConvertFrom(typeof(string))」 – Grrbrr404

+0

@PVitt:它只是關於「最佳實踐」,我讀過你應該避免使用正常程序操作的例外。我相信這就是爲什麼TryParse()方法與Parse()一起存在的原因。老實說,如果有比這更好的方法,那可以讓我做我需要的,我更喜歡那個。 :) – mj82

回答

6

我會檢查的方法TypeConverter.IsValid,雖然:從CanConvertFrom

開始在.NET Framework版本4,IsValid的方法捕獲異常和ConvertFrom方法。如果輸入值類型導致CanConvertFrom返回false,或者如果輸入值導致ConvertFrom引發異常,則IsValid方法返回false。

這意味着,如果你不擅自使用try ...趕上你要兩倍的值轉換。

+0

很好的答案。這實際上解決了我上週提出的一個問題。 – psubsee2003

6

不應將類型作爲字符串傳入,而應使用泛型,例如

public bool CanConvert<T>(string data) 
{ 
    TypeConverter converter = TypeDescriptor.GetConverter(typeof(T)); 
    return converter.IsValid(data); 
} 

使用

bool test1 = CanConvert<Int32>("1234"); // true 
bool test2 = CanConvert<Int32>("hello"); // false 
+0

泛型將要求OP知道編譯類型的類型,它看起來不是。 – psubsee2003

+0

**如果我之前知道確切的類型,或者可以做這樣的事情,那**會是完美的**:'bool test1 = CanConvert (testStringOk);'我不但是,它會動態讀取並保持字符串可變。 – mj82

+0

@ mj82 - 好吧,我會更新我的答案。 – James

0

如果他們只是內置.NET類型,你可以做根據System.TypeCode轉換。您可以將typecode存儲在您的XML中(或將您的類型字符串轉換爲TypeCode)並執行類似操作:

switch (code) 
{ 
    case TypeCode.Boolean: 
     bool.TryParse(value, out result); 
     break; 
    case TypeCode.Int32: 
     int.TryParse(value, out result); 
    ... 
} 
+0

我一直在想它,但有太多的線路。 :)使用TypeConverter.IsValid,它可以用3行完成。不管怎麼說,還是要謝謝你 :) – mj82

相關問題