检查字符串类型到其他类型的转换
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
的是Int32Converter
。 TypeDescriptor.GetConverter(typeof(int))
给你。
本质上,TypeConverter
通常用于格式化要显示的目标类型,或将输入解析回该目标类型。显示或解析字符串 to/from 一个字符串并没有太多涉及,所以您听到 StringConverter
做的很少!这里,有趣的类型是 int
,Int32Converter
知道如何格式化一个 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).
我正在使用反射,我想为异常处理做转换检查。
我需要检查字符串是否可以在我的项目中转换为未知类型。
我用过:
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
的是Int32Converter
。 TypeDescriptor.GetConverter(typeof(int))
给你。
本质上,TypeConverter
通常用于格式化要显示的目标类型,或将输入解析回该目标类型。显示或解析字符串 to/from 一个字符串并没有太多涉及,所以您听到 StringConverter
做的很少!这里,有趣的类型是 int
,Int32Converter
知道如何格式化一个 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).