知识大全 如何将字符串动态转换为指定的值类型
Posted 类型
篇首语:人生的旅程就是这样,用大把的时间迷茫 ,在几个瞬间成长。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 如何将字符串动态转换为指定的值类型相关的知识,希望对你有一定的参考价值。
先看一个字符串动态转换的典型例子
如下函数 我们只知道value 是一个基本值类型 比如(System Int System Int System Double 等等) 或者是一个字符串类型 但我们无法在编码时确定这个value 具体是什么类型 它可能是由一个外部组件从某个数据源中读出来的基本类型中的一种类型的实例或者是字符串类型实例
这个函数希望实现比较value 是否在minValue maxValue这两个字符串对应的数值区间类 其中minValue 和 maxValue 构成一个闭区间 即
value in [minValue maxValue]
public static bool MyComparer(object value string minValue string maxValue)
要解决这个问题 我们需要解决两个基本问题
如何比较value 和 minValue maxValue
如何将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) 函数
MethodInfo parseMethod = null;
foreach (MethodInfo mi in type GetMethods(BindingFlags Static | BindingFlags Public))if (mi Name == Parse && mi GetParameters() Length == )parseMethod = mi;break;
接下来就是如何调用这个函数来动态转换字符串了
如下面代码 我们调用MethodInfo 的 Invoke 方法来动态调用这个函数 由于是静态函数 第一个参数 obj 传入null 并在第二个参数中带入value 这个参数
parseMethod Invoke(null new object[] value );
下面给出字符串动态转换为指定类型的完整代码
using System;using System Collections Generic;using System Text;using System Reflection;
namespace Eagelt Convertpublic class ConvertStringpublic static object ToType(Type type string value)if (type == typeof(string))return value;
MethodInfo parseMethod = null;
foreach (MethodInfo mi in type GetMethods(BindingFlags Static | BindingFlags Public))if (mi Name == Parse && mi GetParameters() Length == )parseMethod = mi;break;
if (parseMethod == null)throw new ArgumentException(string Format( Type: has not Parse static method! type));
return parseMethod Invoke(null new object[] value );
MyComparer 函数的完整代码
public static bool MyComparer(object value string minValue string maxValue)IComparable parableObj = value as IComparable;
object min;object max;
if (parableObj == null)throw new ArgumentException(string Format( Type: does not inherit from IComparable value GetType()));
min = ConvertString ToType(value GetType() minValue);max = ConvertString ToType(value GetType() maxValue);
return parableObj CompareTo(min) >= && parableObj CompareTo(max) <= ;
测试代码
Console WriteLine(MyComparer( ));Console WriteLine(MyComparer( ));Console WriteLine(MyComparer((byte) ));Console WriteLine(MyComparer((double) ));Console WriteLine(MyComparer( ));
测试结果
TrueFalseTrueFalseFalse
最后提一个简单的问题 供大家思考 如果我们需要将字符串动态转换成我们自己定义的复杂类型
如何实现呢?
比如我们有一个结构
struct UInt
public ulong Low;
public ulong High;
我们将这个结构的实例对象传入到函数
Console WriteLine(MyComparer((UInt ) ));
cha138/Article/program/net/201311/11386相关参考
以下是对php中的数组与字符串的转换函数进行了详细的整理汇总需要的朋友可以参考下 将一个字符串转化为数组str_split()用于将一个字符串转化为数组语法复制代码代码如下:str_sp
Assembly的CreateInstance有三个重载第一个参数需要是一个字符串表示的完整的类名第二个参数是一个bool类型如果为true表示对第一个参数不区分大小写 第三个影响执行搜索的方式
将一个BigDecimal类型的数转换成中文 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! pu
Delphi把流中的字符串转换为UTF格式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本例效
ASP标记的字符串指定变色不区分大小写 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 普通的替换
//字符是否为汉字 publicboolIsChinese(charc) return(int)c>=xE&&(int)c<=xFA; //获得字节长度
cha138/Article/program/Java/JSP/201311/20012
ORACLE行列转换-拼成字符串 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 前段时间使用OR
.NET上根据字符串动态创建控件 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 首先利用Syst
JSP中把动态页面转换为静态页面 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 要自动生成静态页