如何将String类型转换成任意基本类型
前几天,在写一个自动从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类型转换成任意基本类型的更多相关文章
- Java String类型转换成Date日期类型
插入数据库时,存入当前日期,需要格式转换 import java.text.SimpleDateFormat; formatter = new SimpleDateFormat( "yyyy ...
- C# 字符串string类型转换成DateTime类型 或者 string转换成DateTime?(字符串转换成可空日期类型)
在c#中,string类型转换成DateTime类型是经常用到的,作为基本的知识,这里在此做个小结.一般来说可以使用多种方法进行转换,最常用的就是使用Convert.ToDateTime(string ...
- 字符串string类型转换成DateTime或DateTime?类型
常用的Convert.ToDateTime方法 //将含有正确日期格式的string类型转换成DateTime类型 string strDate = "2014-08-01"; D ...
- C#String类型转换成Brush类型
C#String类型转换成Brush类型: using System.Windows.Media; BrushConverter brushConverter = new BrushConverter ...
- 【转载】C#里怎么把string类型转换成double
在C#的数字计算过程中,有很多的方法可以将字符串String类型的变量转换为double类型,double.Parse方法.Convert.ToDouble方法.double.TryParse方法等都 ...
- java中string类型转换成map
背景:有时候string类型的数据取出来是个很标准的key.value形式,通过Gson的可以直接转成map 使用方式: Gson gson = new Gson(); Map<String, ...
- C#种将String类型转换成int型
API: 有一点是需要注意的,那就是必须保证该String类型内全为数字,能确保转换正确: 1.int.Parse(str); 2.TryParse(str, out intA); 3. Conver ...
- android String 类型转换成UTF-8格式
在android开发中,有时候会遇到汉字乱码的问题,在这个时候,吧String串加一个编码格式转换,转换成UTF-8的格式就可以了 public static String toUtf8(String ...
- Object类型转换成自定义类型(向下转型)
Object类型转换成自定义类型 场景: 从数据库或者别的途径接收对象的时候用Object,但是用的时候怎么object点(方法提示 | alt+'/'),都点不出自定义类型的方法. 比如,数据库查询 ...
随机推荐
- Oracle 删除重复数据的几种方法
去重 第一种:distinct create table tmp_t3 as select distinct * from t3; drop table t3; alter table tmp_t2 ...
- 使用Xcode的Targets来管理开发和生产版本的构建
如何创建一个新的Target 如何在Xcode中创建一个开发的target?我使用示例项目“todo”引导您一步一步完成整个过程..您也可以使用自己的项目并按照步骤: 1. 在项目的导航面板进入项目设 ...
- 【Uva 1252】Twenty Questions
[Link]: [Description] 给你n个物体,每个物体都有m种属性; (每个物体的属性都能和别的物体的属性区别) 现在,你已知这n个物体; 然后让一个人心里想一个物体 你可以问这个人,这个 ...
- 各消息队列对比,Kafka深度解析,众人推荐,精彩好文!
http://blog.csdn.net/allthesametome/article/details/47362451
- linux杂谈(十八):DNSserver的配置(一)
1.DNSserver简单介绍 域名系统(英文:Domain Name System,縮寫:DNS)是因特网的一项服务. 它作为将域名和IP地址相互映射的一个分布式数据库,可以使人更方便的訪问互联网. ...
- android側滑菜单-DrawerLayout的基本使用
眼下主流App开发中,部分是以側滑菜单为主布局架构,曾经做android側滑菜单时.大多选择使用github上的第三方开源框架SildingMenu,可是这个框架还是稍显笨重.好消息是google已经 ...
- P2P进入整顿期,平衡风险和收益之间的矛盾是关键
毫无疑问,P2P网贷进入了其诞生以来最为关键的整顿期,随着大量提现困难.跑路的P2P平台被曝光之后.行业对P2P网贷的发展也多了几分慎重.少了几分浮躁.只是,P2P网贷所面临的问题正是其它不论 ...
- QQ 5.0的一些特效学习 一
虽然QQ5.0已经过去很久了,但是有些特效还是值得学习的 效果: 源码点我 导入的jar包, 一个是高版本的support.v4包,需要这个v4包中有ViewDragHelper. 我这里使用的是su ...
- 如何优雅地关闭一个socket
最近在windows编程时需要考虑到“如何优雅地关闭一个socket”,查阅了一些资料,现将查到的相关资料做个汇编,希望能对后来者有所帮助(比较懒,所以英文资料没有翻译:-)) 1. 关闭Socket ...
- VB&XML的增删改查
简介:XML的增删改查 开发过程中有许多后台操作XML的过程,每次需要操作时都是找很多代码来参考或者百度一下.今天决定补充下XML操作的知识,把XML操作的增删改查都写了一遍,供以后开发参考 查询: ...