ssma为什么动态字符串需要手动转换
发布网友
发布时间:2022-03-28 22:14
我来回答
共1个回答
热心网友
时间:2022-03-28 23:43
我们日常工作中经常会遇到将字符串转换为值类型的问题,比如"123"
转换为一个Int32类型,这个很简单,我们只要调用int.Parse 函数就可以实现。eaglet
今天要说的是,一些应用中往往在编码阶段无法知道字符串需要转换成的值类型的具体类型,而需要在运行时动态指定类型进行转换,遇到这种问题,我们如何解决?
一个典型的例子。
如下函数,我们只知道value 是一个基本值类型,比如(System.Int32, System.Int16,
System.Double 等等) 或者是一个字符串类型。但我们无法在编码时确定这个value
具体是什么类型,它可能是由一个外部组件从某个数据源中读出来的基本类型中的一种类型的实例或者是字符串类型实例。
这个函数希望实现比较value 是否在minValue, maxValue这两个字符串对应的数值区间类,其中minValue 和 maxValue 构成一个闭区间,即
value in [minValue, maxValue]
public static bool MyComparer(object value, string minValue, string maxValue)
要解决这个问题,我们需要解决两个基本问题。
1. 如何比较value 和 minValue, maxValue
2. 如何将minValue 和 maxValue 转换到value 对应的数据类型
首先我们来看如何进行比较
所有的基本值类型和string 类型都实现 IComparable这个接口。我们可以指定 value 为
IComparable,然后调用CompareTo来进行比较。不过这里有个问题,CompareTo 函数的参数obj 虽然是一个 object
类型,但这个 obj 的类型必须和 value 一致,否则将发生异常。也就是说我们不能把minValue 任意转换成某个类型比如 long
带进去,而需要将 minValue 和 maxValue 转换成和 value 一样的类型才行。
下面我们就来讨论如何将字符串转换为指定的值类型。
我们需要实现下面的函数:
public static object ToType(Type type, string value)
type 为指定的类型,value 为输入的字符串。
首先我们知道所有的基本值类型都有一个叫 Parse 静态函数,我们只要把这个静态函数反射出来,就可以通过这个静态函数将字符串转换成对应的值类型。
下面代码给出如何反射出这个静态函数。通过向对象type(Type类型)的GetMethods 函数输入 BindingFlags.Static
| BindingFlags.Public 参数,我们可以枚举出这个类型所有的静态公共函数。
然后我们判断这个函数的名称是否为 "Parse" ,由于 Parse 函数有多个重载,但一个参数的重载只有 Parse (String)
所以我们需要判断mi 只有一个参数,这时取到的 mi 就是 Parse (String) 函数。