检查字符串类型到其他类型的转换

Check conversion of type string to other types

我正在使用反射,我想为异常处理做转换检查。

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

我用过:

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

但它 returns 错误!

甚至这个 returns 又是假的 :

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

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

编辑:

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

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

一个StringConverter只关心string。您需要的是 System.ComponentModel.Int32Converter。关心int的是Int32ConverterTypeDescriptor.GetConverter(typeof(int)) 给你。

本质上,TypeConverter 通常用于格式化要显示的目标类型,或将输入解析回该目标类型。显示或解析字符串 to/from 一个字符串并没有太多涉及,所以您听到 StringConverter 做的很少!这里,有趣的类型是 intInt32Converter 知道如何格式化一个 int 来显示,并从输入中解析一个 int

StringConverter状态的docs

This converter can only convert to a string. It works as a pass through for other converters that want to convert an object to a string.

Int32Converter,另一方面,声明:

This converter can only convert a 32-bit signed integer object to and from a string. The Int32 value type represents signed integers with values ranging from negative 2,147,483,648 through positive 2,147,483,647.

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

或者,考虑编写一个 Convert.TryChangeType 扩展方法,其中包含一个 try catch 块 - 这将使您不必担心各个转换器。实际上你会 'try it and see'。 这在您不确定它们是否会在运行时之前工作的转换时尤其重要(例如 "abc" 到 int)。

除了 CanConvertFrom 的实施的奇怪之处,在您的上下文中,如果您知道在您尝试之前可以执行某个转换,您将不会得到太多帮助。转换器无法仅根据类型给您明确的答案,原因与问题 "can a string be converted to integer" 没有单一答案的原因相同:答案是 "it depends on the string" - 即字符串 "123" 可以可以转换为int,而字符串"hello""1234567891011121314151617181920"不能转换为int.

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