2011-11-22 64 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

相关问题