检查类型字符串到其他类型

时间:2018-03-28 11:21:20

标签: c# casting type-conversion string-conversion

我正在使用反射,我想对异常处理进行转换检查。

我需要检查字符串是否可以在我的项目中转换为未知类型。

我用过:

TypeConverter t = TypeDescriptor.GetConverter(typeof(string));
            Console.WriteLine(t.CanConvertTo(typeof(int)));

但它返回false!

甚至这个再次返回false:

StringConverter stringConverter = new StringConverter();
            Console.WriteLine(stringConverter.CanConvertTo(typeof(int)));

我的问题是为什么StringConverter返回false以将字符串转换为int ???

编辑:

我使用此代码将字符串转换为未知类型:(结果为字符串)

resultCastedToTargetPropertyType = Convert.ChangeType(result,propertyInfo.PropertyType);

3 个答案:

答案 0 :(得分:3)

暂时执行CanConvertFrom的奇怪之处,在您的上下文中,您知道在尝试之前可以执行某个转换时,您将无法获得太多帮助。转换器无法单独根据类型给出明确的答案,原因与“字符串可以转换为整数”这一问题没有单一答案的相同:答案是“它取决于字符串” - 即字符串"123"可以转换为int,而字符"hello""1234567891011121314151617181920"无法转换为int

换句话说,只有当您知道要转换的值时才能获得答案。在您的情况下,这意味着在try的调用周围放置catch / Convert.ChangeType块,并解释它可能抛出的四个异常中的每一个(reference)。

答案 1 :(得分:1)

StringConverter只关注string。你需要的是System.ComponentModel.Int32Converter。关注Int32Converter的{​​{1}}是intTypeDescriptor.GetConverter(typeof(int))为您提供了这一点。

实质上,TypeConverter通常用于格式化要显示的目标类型,或者将输入解析回该目标类型。在字符串中显示或解析字符串并没有太多涉及,所以你会惊讶地发现StringConverter做得很少!在这里,有趣的类型是intInt32Converter知道如何格式化int以进行显示,并从输入中解析int

答案 2 :(得分:1)

StringConverter州的docs

  

此转换器只能转换为字符串。它作为一个通行证   通过其他想要将对象转换为a的转换器   字符串。

另一方面,

Int32Converter声明:

  

此转换器只能将32位有符号整数对象转换为和   从一个字符串。 Int32值类型表示带符号的有符号整数   价值从负2,147,483,648到正数   2147483647。

因此Int32Converter可能是你想要使用的,而不是StringConverter

或者,考虑编写一个Convert.TryChangeType扩展方法,其中包含try catch块 - 这样可以避免您不必担心各个转换器。实际上,您将尝试并查看'。 这在进行转换时尤为重要,因为您无法确定它们是否会在运行时工作(例如" abc"到int)。