知识大全 如何将字符串动态转换为指定的值类型

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的数组与字符串的转换函数整理汇总

以下是对php中的数组与字符串的转换函数进行了详细的整理汇总需要的朋友可以参考下   将一个字符串转化为数组str_split()用于将一个字符串转化为数组语法复制代码代码如下:str_sp

知识大全 学习反射中的动态创建对象

  Assembly的CreateInstance有三个重载第一个参数需要是一个字符串表示的完整的类名第二个参数是一个bool类型如果为true表示对第一个参数不区分大小写  第三个影响执行搜索的方式

知识大全 将一个BigDecimal类型的数转换成中文

将一个BigDecimal类型的数转换成中文  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  pu

知识大全 Delphi把流中的字符串转换为UTF格式

Delphi把流中的字符串转换为UTF格式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本例效

知识大全 ASP标记的字符串指定变色不区分大小写

ASP标记的字符串指定变色不区分大小写  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  普通的替换

知识大全 c#中英文混合字符串截取指定长度

  //字符是否为汉字  publicboolIsChinese(charc)    return(int)c>=xE&&(int)c<=xFA;    //获得字节长度 

知识大全 java获得字符串间运算符变量的值

cha138/Article/program/Java/JSP/201311/20012

知识大全 ORACLE行列转换-拼成字符串

ORACLE行列转换-拼成字符串  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前段时间使用OR

知识大全 .NET上根据字符串动态创建控件

.NET上根据字符串动态创建控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  首先利用Syst

知识大全 JSP中把动态页面转换为静态页面

JSP中把动态页面转换为静态页面  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  要自动生成静态页