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