我正在使用反射,我想对异常处理进行转换检查。
我需要检查字符串是否可以在我的项目中转换为未知类型。
我用过:
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);
答案 0 :(得分:3)
暂时执行CanConvertFrom
的奇怪之处,在您的上下文中,您知道在尝试之前可以执行某个转换时,您将无法获得太多帮助。转换器无法单独根据类型给出明确的答案,原因与“字符串可以转换为整数”这一问题没有单一答案的相同:答案是“它取决于字符串” - 即字符串"123"
可以转换为int
,而字符"hello"
和"1234567891011121314151617181920"
无法转换为int
。
换句话说,只有当您知道要转换的值时才能获得答案。在您的情况下,这意味着在try
的调用周围放置catch
/ Convert.ChangeType
块,并解释它可能抛出的四个异常中的每一个(reference)。
答案 1 :(得分:1)
StringConverter
只关注string
。你需要的是System.ComponentModel.Int32Converter
。关注Int32Converter
的{{1}}是int
。 TypeDescriptor.GetConverter(typeof(int))
为您提供了这一点。
实质上,TypeConverter
通常用于格式化要显示的目标类型,或者将输入解析回该目标类型。在字符串中显示或解析字符串并没有太多涉及,所以你会惊讶地发现StringConverter
做得很少!在这里,有趣的类型是int
,Int32Converter
知道如何格式化int
以进行显示,并从输入中解析int
。
答案 2 :(得分:1)
StringConverter
州的docs:
另一方面,此转换器只能转换为字符串。它作为一个通行证 通过其他想要将对象转换为a的转换器 字符串。
此转换器只能将32位有符号整数对象转换为和 从一个字符串。 Int32值类型表示带符号的有符号整数 价值从负2,147,483,648到正数 2147483647。
因此Int32Converter
可能是你想要使用的,而不是StringConverter
。
或者,考虑编写一个Convert.TryChangeType
扩展方法,其中包含try catch
块 - 这样可以避免您不必担心各个转换器。实际上,您将尝试并查看'。 这在进行转换时尤为重要,因为您无法确定它们是否会在运行时工作(例如" abc"到int)。