测试字符串是否可以转换为其他各种类型

时间:2011-11-22 13:00:00

标签: c# visual-studio-2010 .net-4.0

(已解决)我正在构建一个可以根据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);
}

3 个答案:

答案 0 :(得分:6)

我会检查方法TypeConverter.IsValid,但是:

  

从.NET Framework版本4开始,IsValid方法捕获CanConvertFrom和ConvertFrom方法中的异常。如果输入值类型导致CanConvertFrom返回false,或者输入值导致ConvertFrom引发异常,则IsValid方法返回false。

这意味着如果你不自己使用try ... catch,你将转换两倍的价值。

答案 1 :(得分: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

答案 2 :(得分:0)

如果它们只是内置的.NET类型,则可以基于System.TypeCode进行转换。您可以将类型代码存储在XML中(或将类型字符串转换为TypeCode)并执行以下操作:

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