|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
中间码是基于一个虚拟机器。源代码是最高层的,理论上从源代码开始直接编译成本地码能提供最大优化的。而中间码只能是转译成本地码,效率上难免受到损耗。根据虚拟机器所设定的体系结构的特点,和本地机器的差异的多少。asp.net|工具|数据用过MonoRail的伴侣应当晓得它供应的工具成员数据绑定功效十分便利,经由过程标志参数属性或办法就能够主动把提交返来的数据和工具成员举行绑定;有了这些便利的功效切实其实能够节俭大批的set代码。不外这些功效只是MonoRail供应,因而完成相似的功效便利本人开辟。
完成方针:能够天真便利地完成数据绑定。
OrderSearchsearch=FormContext.BindObject<OrderSearch>();
Ordersorder=FormContext.BindObject<Orders>("order");
制订划定规矩和束缚
起首断定WEB提交的数据和成员属性的映照干系,能够经由过程称号商定的体例:
<inputid="Text1"name="companyname"type="text"/>
xxxx.LastName、xxxx_LastName或xxxxLastName等。在绑历程能够指定前缀举行工具成员的绑定;不外在webForm控件的Name是asp.net天生的,在干系剖析上就绝对庞大些。
范例转换接口的界说
由于转换的情形是很难断定;除。NET的基本范例外实践使用中还会存在其他转换体例,如:HttpPostedFile到byte[],序列化String到Object等。因而制订转换接口就能够便利完成可扩大和可设置。
publicinterfaceIStringConverter
{
objectConvertTo(stringvalue,outboolsucceeded);
}
因为Web供应的数据年夜部分是以string的体例供应,因而界说一个基于string转换形貌。基于接口的实也很复杂:
publicclassToSbyte:IStringConverter
{
#regionIStringConverter成员
objectIStringConverter.ConvertTo(stringvalue,outboolsucceeded)
{
sbytenvalue;
succeeded=sbyte.TryParse(value,outnvalue);
returnnvalue;
}
#endregion
}
IStringConverter工场的完成
因为转换情形的不断定性,因而经由过程工场的体例来到达代码对外的关闭性和优秀的扩大性。能够经由过程方针范例来猎取相干转换实例,在.NET中IDictionary就可以够到达使用的请求。
staticIDictionary<Type,IStringConverter>mConverters;
publicstaticIDictionary<Type,IStringConverter>Converters
{
get
{
if(mConverters==null)
{
lock(typeof(ConverterFactory))
{
OnInit();
}
}
returnmConverters;
}
}
staticvoidOnInit()
{
if(mConverters!=null)
return;
mConverters=newDictionary<Type,IStringConverter>();
mConverters.Add(typeof(byte),newToByte());
LoadConfig();
}
//从设置文件加载转换器映照,假如设置存在不异范例转器就代替原有转换器
staticvoidLoadConfig()
{
//LoadConfig
//<convertertype="System.Int32",value="HFSoft.Binder.ToByte"
}
为了便利利用能够在工场中硬编码设置外部基本范例;由于转换情形的不断定,以是同意经由过程设置文件的体例引进分歧情形的范例转换器。
能够扩大性的CustomAttribute
固然工场能够到达转换接口的可设置性,但实践上很难到达使用请求;在某些情形下范例转换器只是在某些工具成员中无效(固然设置文件也能够到达期请求,但在设置文件中界说这么小的粒度并非好的选择);经由过程Attribute给相干Property指定范例转换器十分合适。
///<summary>
///用于特别情形下形貌工具详细成员的转换器
///</summary>
[AttributeUsage(AttributeTargets.Property)]
publicclassConverterAttribute:Attribute,IStringConverter
{
publicConverterAttribute(Typeconvertertype)
{
mConverterType=convertertype;
}
publicConverterAttribute(Typeconvertertype,stringdefvalue)
{
mConverterType=convertertype;
mDefaultValue=defvalue;
}
privateTypemConverterType;
publicTypeConverterType
{
get
{
returnmConverterType;
}
}
privateStringmDefaultValue;
publicStringDefaultValue
{
get
{
returnmDefaultValue;
}
set
{
mDefaultValue=value;
}
}
protectedIStringConverterCreateInstance()
{
if(mConverters.ContainsKey(ConverterType))
returnmConverters[ConverterType];
lock(typeof(ConverterAttribute))
{
if(!mConverters.ContainsKey(ConverterType))
{
mConverters.Add(ConverterType,(IStringConverter)Activator.CreateInstance(ConverterType));
}
returnmConverters[ConverterType];
}
}
staticIDictionary<Type,IStringConverter>mConverters=newDictionary<Type,IStringConverter>();
#regionIStringConverter成员
publicobjectConvertTo(stringvalue,outboolsucceeded)
{
stringnewvalue=value!=null?value:DefaultValue;
returnCreateInstance().ConvertTo(newvalue,outsucceeded);
}
#endregion
}
经由过程ConverterAttribute能够便利制订粒度更小的设置
privatebyte[]mFileStream;
[Converter(typeof(FileStreamConverter),"IconPhoto")]
publicbyte[]FileStream
{
get
{
returnmFileStream;
}
set
{
mFileStream=value;
}
}
以上界说能够上传文件流转成byte[]到FileStream属性中。
功效集成完成
如今就把一切器材集成起来,满意目标的请求。
publicobjectBind(System.Collections.Specialized.NameValueCollectionvalues,stringprefix)
{
objectnewobj=Activator.CreateInstance(ObjectType);
if(prefix==null)
prefix="";
objectvalue;
foreach(PropertyInfoiteminProperties)
{
value=values[prefix+"."+item.Name];
if(value==null)
value=values[prefix+"_"+item.Name];
if(value==null)
value=values[prefix+item.Name];
BindProperty(newobj,item,(string)value);
}
returnnewobj;
}
privatevoidBindProperty(objectobj,PropertyInfoproperty,stringvalue)
{
IStringConverterstringconver;
objectnvalue;
boolconfirm=false;
Object[]cas=property.GetCustomAttributes(typeof(ConverterAttribute),true);
if(cas.Length>0)
{
nvalue=((ConverterAttribute)cas[0]).ConvertTo(value,outconfirm);
if(confirm)
mPropertiesHandle[property].SetValue(obj,nvalue);
}
else
{
if(ConverterFactory.Converters.ContainsKey(property.PropertyType))
{
stringconver=ConverterFactory.Converters[property.PropertyType];
nvalue=stringconver.ConvertTo(value,outconfirm);
if(confirm)
mPropertiesHandle[property].SetValue(obj,nvalue);
}
}
}
由于Web提交的数据几近能够经由过程HttpRequest.Params失掉,只必要依据属性称号和相干前缀举行婚配查找就能够了。这里完成的婚配体例其实不幻想,实在能够在相干page第一次哀求就能够剖析到干系存在IDictionary中,前期间接利用就能够了。
以上功效是在编写一个MVC组件的数据绑定功效,实在完整能够移植传统的WebForm下事情;有更好设法的伴侣请多提交定见。
我见过java运行在手机上,包括很廉价的山寨手机,但是却暂时没发现.net在手机上有什么作为。wp7可能是个转机,但是按照《Java的跨平台就是一句谎言。那.net的跨平台也当之无愧是一句谎言。 |
|