[原创][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. MySQL Pool

    创建连接池 function SqlPool() { this.flag = true;//是否连接过 this.pool = mysql.createPool({ host : 'localhost ...

  2. js中迭代的常用几种方法

    var arr = [1,3,2,5,3]; //forEach 两个参数,第一个为数组内容,第二个为数组下标arr.forEach(function(item,index) { console.lo ...

  3. Js 中的i++ 和 ++i 的区别

    首先碰见  i++ 和 ++i 会一脸蒙蔽 感觉没什么区别,都是相加  , 但是  输出的值是不同!!! 来奉上代码来进行比较 var i = 1; var a = i++; //a = 1; 此时i ...

  4. 【C/C++】链表的理解与使用

    转载自:http://blog.csdn.NET/xubin341719/article/details/7091583/ 最近不是太忙,整理些东西,工作也许用得到. 1,为什么要用到链表 数组作为存 ...

  5. [Python] for.. not in.. Remove Deduplication

    Write a function, remove_duplicates that takes a list as its argument and returns a new list contain ...

  6. msp430在ccsv5下出现的问题总结

    一.内存问题 问题描写叙述,报错: program will not fit into available memory.  placement with alignment fails for se ...

  7. Activity 之间 传递 List 封装的对象或者对象

    项目中遇到 从也个页面向还有一个页面跳转传递一个List 封装的对象 .按网上查的资料 须要把 对象 实现 Serializable接口. 写了一下.可是跳转直接崩溃.一直看错误之日找不到原因后来自习 ...

  8. 版本号控制-搭建gitserver

    GitHub是一个免费托管开源码的Gitserver,假设我们不想公开项目的源码,又不想付费使用.那么我们能够自己搭建一台Gitserver. 以下我们就看看,怎样在Ubuntu上搭建Gitserve ...

  9. C++ 递归位置排列算法及其应用

    废话不多说,我们先看一下位置排序的算法: #include <iostream> using namespace std; int n = 0; int m = 2; int l = 0; ...

  10. private SortedDictionary<string, object> Dic_values = new SortedDictionary<string, object>();

    private SortedDictionary<string, object> Dic_values = new SortedDictionary<string, object&g ...