C#将String类型转换成任意基本类型.docx
《C#将String类型转换成任意基本类型.docx》由会员分享,可在线阅读,更多相关《C#将String类型转换成任意基本类型.docx(6页珍藏版)》请在冰豆网上搜索。
C#将String类型转换成任意基本类型
前几天,在写一个自动从XML中读取数值并注入到对象属性中去的时候,为了方便,不想把原来是int类型的写与string类型,但是从XML里读取出来的时候,都是string类型。
这时就需要将string类型自动地根据对象属性的类型转换过来。
比如string==>int/long/double/DateTime/enum/String/bool....
刚开始的时候,确实有点犯傻,来个长长的switch。
但是突然间想到,在使用mvc的时候,它们不是也把从表单或URL中传上来的值自动转换成对应的类型了吗?
hoho~~~
眼前一亮,就这么整,看看人家怎么做到的。
使用反编译软件Reflector打开System.Web.Mvc(直接在VS2008下右键选择Reflector打开就行了,默认位置在C:
\ProgramFiles\MicrosoftASP.NET\ASP.NETMVC1.0\Assemblies\System.Web.Mvc.dll)
顺着mvc的访问路径,一路到了下来。
发现原来还有一个这么简单的方法,这里直接把我简单的DEMO列出来,相信大家都很容易看明白了:
usingSystem;
usingSystem.ComponentModel;
namespaceYcoeXu.Common
{
publicstaticclassStringExtensions
///
///将字符串格式化成指定的数据类型
publicstaticObjectFormat(thisStringstr,Typetype)
if(String.IsNullOrEmpty(str))
returnnull;
if(type==null)
returnstr;
if(type.IsArray)
TypeelementType=type.GetElementType();
String[]strs=str.Split(newchar[]{';'});
Arrayarray=Array.CreateInstance(elementType,strs.Length);
for(inti=0,c=strs.Length;i { array.SetValue(ConvertSimpleType(strs[i],elementType),i); } returnarray; } returnConvertSimpleType(str,type); } privatestaticobjectConvertSimpleType(objectvalue,TypedestinationType) { objectreturnValue; if((value==null)||destinationType.IsInstanceOfType(value)) { returnvalue; }欢迎进入.NET社区论坛,与200万技术人员互动交流>>进入 stringstr=valueasstring; if((str!=null)&&(str.Length==0)) { returnnull; } TypeConverterconverter=TypeDescriptor.GetConverter(destinationType); boolflag=converter.CanConvertFrom(value.GetType()); if(!flag) { converter=TypeDescriptor.GetConverter(value.GetType()); } if(!flag&&!converter.CanConvertTo(destinationType)) { thrownewInvalidOperationException("无法转换成类型:"+value.ToString()+"==>"+destinationType); } try { returnValue=flag?converter.ConvertFrom(null,null,value):converter.ConvertTo(null,null,value,destinationType); } catch(Exceptione) { thrownewInvalidOperationException("类型转换出错:"+value.ToString()+"==>"+destinationType,e); } returnreturnValue; } } } DEMO: 在配置文件里自定义配置: 1.在节点内添加节点: 2.写配置看起来会是这样的: //..其它代码 写个类自动加载 usingSystem; usingSystem.Reflection; usingSystem.Collections.Specialized; usingSystem.Configuration; usingYcoeXu.Common; namespaceYcoeXu.Test { publicclassXuConfig { privateXuConfig(){} privatestaticXuConfigconfig=null; privatestaticXuConfigInstance { get { if(config==null) { config=newXuConfig(); Typetype=typeof(XuConfig); //从配置文件里读取XuConfig节点 NameValueCollectionxuConfig=(NameValueCollection)ConfigurationManager.GetSection("XuConfig"); //根据Key匹配对应的属性 foreach(StringkeyinxuConfig.AllKeys) { PropertyInfopi=type.GetProperty(key); if(pi==null||String.IsNullOrEmpty(xuConfig[key])) continue; //自动转换类型并注入值 pi.SetValue(config,xuConfig[key].Format(pi.PropertyType),null); } } returnconfig; } } publicintID{set;get;} publicStringName{set;get;} publicRole[]Roles{set;get;} publicvoidTest() { Console.WriteLine(XuConfig.Instance.Name); Console.WriteLine(XuConfig.Instance.ID); foreach(RolerinXuConfig.Instance.Roles) { Console.WriteLine(r.ToString()); } } } publicenumRole { Guest, Member, Manager, Admin } } 注意了,一定要添加一个引用:System.Configuration 这里对String进行了一些扩展,使它可以直接当成String对象的方法访问了,是不是很方便呢。hoho~~~ 项目中的一点点心得,发现网上还没有人放出这种方法,这里就写出来给大家分享下,相信对大家以后进行类似的自动转换或赋值的功能实现会有很大的帮助 好啦,公司貌似又要转向PHP了,上年刚从java转到C#,明年又要转向其它语言了,hoho~~~ 引用网友的一句话,做人要像柯南这么有霸气,走到哪里,人就死到哪里
array.SetValue(ConvertSimpleType(strs[i],elementType),i);
}
returnarray;
returnConvertSimpleType(str,type);
privatestaticobjectConvertSimpleType(objectvalue,TypedestinationType)
objectreturnValue;
if((value==null)||destinationType.IsInstanceOfType(value))
returnvalue;
欢迎进入.NET社区论坛,与200万技术人员互动交流>>进入
stringstr=valueasstring;
if((str!
=null)&&(str.Length==0))
TypeConverterconverter=TypeDescriptor.GetConverter(destinationType);
boolflag=converter.CanConvertFrom(value.GetType());
if(!
flag)
converter=TypeDescriptor.GetConverter(value.GetType());
flag&&!
converter.CanConvertTo(destinationType))
thrownewInvalidOperationException("无法转换成类型:
"+value.ToString()+"==>"+destinationType);
try
returnValue=flag?
converter.ConvertFrom(null,null,value):
converter.ConvertTo(null,null,value,destinationType);
catch(Exceptione)
thrownewInvalidOperationException("类型转换出错:
"+value.ToString()+"==>"+destinationType,e);
returnreturnValue;
DEMO:
在配置文件里自定义配置:
1.在节点内添加节点:
2.写配置看起来会是这样的:
//..其它代码
写个类自动加载
usingSystem.Reflection;
usingSystem.Collections.Specialized;
usingSystem.Configuration;
usingYcoeXu.Common;
namespaceYcoeXu.Test
publicclassXuConfig
privateXuConfig(){}
privatestaticXuConfigconfig=null;
privatestaticXuConfigInstance
get
if(config==null)
config=newXuConfig();
Typetype=typeof(XuConfig);
//从配置文件里读取XuConfig节点
NameValueCollectionxuConfig=(NameValueCollection)ConfigurationManager.GetSection("XuConfig");
//根据Key匹配对应的属性
foreach(StringkeyinxuConfig.AllKeys)
PropertyInfopi=type.GetProperty(key);
if(pi==null||String.IsNullOrEmpty(xuConfig[key]))
continue;
//自动转换类型并注入值
pi.SetValue(config,xuConfig[key].Format(pi.PropertyType),null);
returnconfig;
publicintID{set;get;}
publicStringName{set;get;}
publicRole[]Roles{set;get;}
publicvoidTest()
Console.WriteLine(XuConfig.Instance.Name);
Console.WriteLine(XuConfig.Instance.ID);
foreach(RolerinXuConfig.Instance.Roles)
Console.WriteLine(r.ToString());
publicenumRole
Guest,
Member,
Manager,
Admin
注意了,一定要添加一个引用:
System.Configuration
这里对String进行了一些扩展,使它可以直接当成String对象的方法访问了,是不是很方便呢。
项目中的一点点心得,发现网上还没有人放出这种方法,这里就写出来给大家分享下,相信对大家以后进行类似的自动转换或赋值的功能实现会有很大的帮助
好啦,公司貌似又要转向PHP了,上年刚从java转到C#,明年又要转向其它语言了,hoho~~~
引用网友的一句话,做人要像柯南这么有霸气,走到哪里,人就死到哪里
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1