[原创][C#] 如何将String类型转换成任意基本类型

Posted on  2009-12-02 09:47  YCOE 阅读( 2843) 评论( 14)  编辑  收藏

前几天,在写一个自动从XML中读取数值并注入到对象属性中去的时候,为了方便,不想把原来是int类型的写与string类型,但是从XML里读取出来的时候,都是string类型。这时就需要将string类型自动地根据对象属性的类型转换过来。

比如string ==> int/long/double/DateTime/enum/String/bool....

刚开始的时候,确实有点犯傻,来个长长的switch。

但是突然间想到,在使用asp.net mvc的时候,它们不是也把从表单或URL中传上来的值自动转换成对应的类型了吗?

hoho~~~

眼前一亮,就这么整,看看人家怎么做到的。

使用反编译软件Reflector打开System.Web.Mvc(直接在VS2008下右键选择Reflector打开就行了,默认位置在C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 1.0\Assemblies\System.Web.Mvc.dll)

顺着asp.net mvc的访问路径,一路到了下来。发现原来还有一个这么简单的方法,这里直接把我简单的DEMO列出来,相信大家都很容易看明白了:


using  System;
using  System.ComponentModel; namespace  YcoeXu.Common
{
     public   static   class  StringExtensions
    {
         ///   <summary> 
         ///  将字符串格式化成指定的数据类型
         ///   </summary> 
         ///   <param name="str"></param> 
         ///   <param name="type"></param> 
         ///   <returns></returns> 
         public   static  Object Format( this  String str, Type type)
        {
             if  (String.IsNullOrEmpty(str))
                 return   null ;
             if  (type  ==   null )
                 return  str;
             if  (type.IsArray)
            {
                Type elementType  =  type.GetElementType();
                String[] strs  =  str.Split( new   char [] {  ' ; '  });
                Array array  =  Array.CreateInstance(elementType, strs.Length);
                 for  ( int  i  =   0 , c  =  strs.Length; i  <  c;  ++ i)
                {
                    array.SetValue(ConvertSimpleType(strs[i], elementType), i);
                }
                 return  array;
            }
             return  ConvertSimpleType(str,type);
        }          private   static   object  ConvertSimpleType( object  value, Type destinationType)
        {
             object  returnValue;
             if  ((value  ==   null )  ||  destinationType.IsInstanceOfType(value))
            {
                 return  value;
            }
             string  str  =  value  as   string ;
             if  ((str  !=   null )  &&  (str.Length  ==   0 ))
            {
                 return   null ;
            }
            TypeConverter converter  =  TypeDescriptor.GetConverter(destinationType);
             bool  flag  =  converter.CanConvertFrom(value.GetType());
             if  ( ! flag)
            {
                converter  =  TypeDescriptor.GetConverter(value.GetType());
            }
             if  ( ! flag  &&   ! converter.CanConvertTo(destinationType))
            {
                 throw   new  InvalidOperationException( " 无法转换成类型: "   +  value.ToString()  +   " ==> "  +  destinationType);
            }
             try 
            {
                returnValue  =  flag  ?  converter.ConvertFrom( null ,  null , value) : converter.ConvertTo( null      ,  null , value, destinationType);
            }
             catch  (Exception e)
            {
                 throw   new  InvalidOperationException( " 类型转换出错: "   +  value.ToString()  +   " ==> "   + destinationType, e);
            }
             return  returnValue;
        }
    }
}

DEMO:

在配置文件里自定义配置:

1. 在<configSections></configSections>节点内添加节点:

<section name="XuConfig" type="System.Configuration.NameValueSectionHandler" />

2. 写配置看起来会是这样的:


     < configSections > 
      //..其它代码
       < section  name ="XuConfig"  type ="System.Configuration.NameValueSectionHandler"   /> 
     </ configSections > 
     < XuConfig > 
       < add  key ="ID"  value ="123" /> 
       < add  key ="Name"  value ="YcoeXu" /> 
       < add  key ="Roles"  value ="Member,Admin" /> 
     </ XuConfig >

写个类自动加载


using  System;
using  System.Reflection;
using  System.Collections.Specialized;
using  System.Configuration;
using  YcoeXu.Common; namespace  YcoeXu.Test
{
     public   class  XuConfig
    {
         private  XuConfig() { }          private   static  XuConfig config  =   null ;          private   static  XuConfig Instance
        {
             get 
            {
                 if  (config  ==   null )
                {
                    config  =   new  XuConfig();
                    Type type  =   typeof (XuConfig);
                     // 从配置文件里读取XuConfig节点 
                    NameValueCollection xuConfig  =  (NameValueCollection)ConfigurationManager.GetSection( "XuConfig " );
                     // 根据Key匹配对应的属性 
                     foreach  (String key  in  xuConfig.AllKeys)
                    {
                        PropertyInfo pi  =  type.GetProperty(key);
                         if  (pi  ==   null   ||  String.IsNullOrEmpty(xuConfig[key]))
                             continue ;
                         // 自动转换类型并注入值 
                        pi.SetValue(config, xuConfig[key].Format(pi.PropertyType),  null );
                    }
                }
                 return  config;
            }
        }          public   int  ID {  set ;  get ; }
         public  String Name {  set ;  get ; }
         public  Role[] Roles {  set ;  get ; }          public   void  Test()
        {
            Console.WriteLine(XuConfig.Instance.Name);
            Console.WriteLine(XuConfig.Instance.ID);
             foreach  (Role r  in  XuConfig.Instance.Roles)
            {
                Console.WriteLine(r.ToString());
            }
        }
    }      public   enum  Role
    {
        Guest,
        Member,
        Manager,
        Admin
    }
}

注意了,一定要添加一个引用:System.Configuration

这里对String进行了一些扩展,使它可以直接当成String对象的方法访问了,是不是很方便呢。hoho~~~

项目中的一点点心得,发现网上还没有人放出这种方法,这里就写出来给大家分享下,相信对大家以后进行类似的自动转换或赋值的功能实现会有很大的帮助

好啦,公司貌似又要转向PHP了,上年刚从java转到C#,明年又要转向其它语言了,hoho~~~

引用网友的一句话,做人要像柯南这么有霸气,走到哪里,人就死到哪里

如何将String类型转换成任意基本类型的更多相关文章

  1. Java String类型转换成Date日期类型

    插入数据库时,存入当前日期,需要格式转换 import java.text.SimpleDateFormat; formatter = new SimpleDateFormat( "yyyy ...

  2. C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)

    在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...

  3. 字符串string类型转换成DateTime或DateTime?类型

    常用的Convert.ToDateTime方法 //将含有正确日期格式的string类型转换成DateTime类型 string strDate = "2014-08-01"; D ...

  4. C#String类型转换成Brush类型

    C#String类型转换成Brush类型: using System.Windows.Media; BrushConverter brushConverter = new BrushConverter ...

  5. 【转载】C#里怎么把string类型转换成double

    在C#的数字计算过程中,有很多的方法可以将字符串String类型的变量转换为double类型,double.Parse方法.Convert.ToDouble方法.double.TryParse方法等都 ...

  6. java中string类型转换成map

    背景:有时候string类型的数据取出来是个很标准的key.value形式,通过Gson的可以直接转成map 使用方式: Gson gson = new Gson(); Map<String, ...

  7. C#种将String类型转换成int型

    API: 有一点是需要注意的,那就是必须保证该String类型内全为数字,能确保转换正确: 1.int.Parse(str); 2.TryParse(str, out intA); 3. Conver ...

  8. android String 类型转换成UTF-8格式

    在android开发中,有时候会遇到汉字乱码的问题,在这个时候,吧String串加一个编码格式转换,转换成UTF-8的格式就可以了 public static String toUtf8(String ...

  9. Object类型转换成自定义类型(向下转型)

    Object类型转换成自定义类型 场景: 从数据库或者别的途径接收对象的时候用Object,但是用的时候怎么object点(方法提示 | alt+'/'),都点不出自定义类型的方法. 比如,数据库查询 ...

随机推荐

  1. MHP 宿舍摄像头在门卫显示方案

    通过VPN拨入公司内网,实现访问外网摄像头. 1.  宿舍和MHP公司各增加一条上网线路(可用移动) 2.宿舍处理:  2台带TF卡 摄像头,加入到萤石云端   130万摄像头+64G TF卡 3.宿 ...

  2. Python正则表达式初识(九)

    继续分享Python正则表达式的基础知识,今天给大家分享的特殊字符是[\u4E00-\u9FA5],这个特殊字符最好能够记下来,如果记不得的话通过百度也是可以一下子查到的. 该特殊字符是固定的写法,其 ...

  3. ZOJ 3175 Number of Containers 分块

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3216 乱搞的...watashi是分块做的...但我并不知道什么是分块...大 ...

  4. python多线程理解

    在发送网络请求的过程中,单个请求的速度总是有着很大的限制,而任务往往需要以更快的速度去执行,这时多线程就是一个很好地选择.python已经给我们封装好了多线程库thread和threading. th ...

  5. 紫书 例题 9-5 UVa 12563 ( 01背包变形)

    总的来说就是价值为1,时间因物品而变,同时注意要刚好取到的01背包 (1)时间方面.按照题意,每首歌的时间最多为t + w - 1,这里要注意. 同时记得最后要加入时间为678的一首歌曲 (2)这里因 ...

  6. 从零開始的Android新项目7 - Data Binding入门篇

    Data Binding自从去年的Google I/O公布到至今,也有近一年的时间了.这一年来,从Beta到如今比較完好的版本号.从Android Studio 1.3到如今2.1.2的支持,能够说D ...

  7. 解决QML开发中ComboBox中一个已选择项没有清除的问题

    解决QML开发中ComboBox中一个已选择项没有清除的问题 近期使用QML开发一个项目.须要使用ComboBox进行显示.当进行一个操作时,须要向ComboBox加入一个元素,当进行另外一个操作时. ...

  8. DB2物化视图(Materialized Query Tables, MQT)

    DB2的物化视图MQT是基于查询结果定义的一个表,MQT中包括的数据来自MQT定义所基于的一个或多个表, 使用MQT能够显著提高查询的操作性能. 数据库的视图和MQT都是基于一个查询来定义的.每当视图 ...

  9. vue -- config.js 配置跨域文件

    1.在使用vue开发的时候经常要涉及到跨域的问题,其实在vue cli中是有我们设置跨域请求的文件的. 2.当跨域无法请求的时候我们可以修改工程下config文件夹下的index.js中的dev -- ...

  10. jq--图片懒加载

    html 1.给图片不给真真意义上的src属性路径,可通过我们自己想要添加时改变它的属性路径即可. 2.要获取浏览器中三种高度. $(window).height();//屏幕高度 $(window) ...