|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
因为二次编译器太复杂,那么建议只是在安装程序的时候编译一次,而不类似java那样运行就编译。并且我觉得,一次痛苦,总比多次低效率要舒服多了。技能|转换 起首我要先容的技能是怎样供应范例参数之间的转换。我们晓得,.NET泛型将每一个范例参数了解为一个自力的范例。假如欠亨过束缚指定,编译器不会对范例参数所代表的范例做任何假定。也就是说,假如在某个高低文中有两个分歧的范例参数U和V,编译器不会晓得运转时他们代表的实在范例可否举行范例转换,因而会回绝编译以下代码:
PublicFunctionGenericCast(OfU,V)(ByValobjAsU)AsV
ReturnCType(obj,V)
EndFunction
除非我们加以束缚U是V的子类。这明显是为了范例平安做出的思索,由于.NET这类跨程序集的泛型没法在编译时做出充足的反省来确保范例平安。可是限定了这类操纵,就妨害了我们办事,良多代码因而写不出来。因而,我们能够使用.NET一切范例的基类Object来绕过这一限定:
ReturnDirectCast(DirectCast(obj,Object),V)
VB的DirectCast运算符在泛型的范例参数上感化与C#的括号运算符不异。也就是说,这段代码用C#写起来是如许:
return(V)(object)obj;
如许,即便不束缚U和V之间的干系,这段代码也能编译了。可是他的功效却不克不及令我们中意。如许写出的范例转换实践上仍是仅当U是V自己或其子类的时分才干转换乐成。而其他统统情形城市转换失利。不论U和V的运转时范例之间是不是界说有其他范例转换划定规矩。这明显分歧我们志愿,我们但愿int与double之间的转换等言语内置的范例转换都可以主动举行,不然就和束缚没甚么两样了。对VB用户来讲有一个极其复杂的办理计划――把第二次DirectCast酿成CType:
PublicFunctionGenericCast(OfU,V)(ByValobjAsU)AsV
ReturnCType(DirectCast(obj,Object),V)
EndFunction
如今,GenericCast泛型办法就可以实行int与double等外置划定规矩的转换了。很奇妙?由于CType运算符在编译时主动挪用了VB运转库的转换函数,该函数在运转时代对泛型范例参数的实在范例做了反省。并且这个历程的功能完整能够承受。
如今VB的用户已轻松享用这一功效了。可是C#的事变还没完,由于C#没有云云智能的范例转换运算符,因而就必要手工完成VB运转库所代庖的那些义务。实在就是使用了一下IConvertible:
staticVGenericCast<U,V>(Uobj)
{
IConvertibleconvertibleObj=objasIConvertible;
if(convertibleObj!=null)
{
Typet=typeof(V);
switch(Type.GetTypeCode(t))
{
caseTypeCode.Boolean:
return(V)(object)convertibleObj.ToBoolean(null);
caseTypeCode.Byte:
return(V)(object)convertibleObj.ToByte(null);
caseTypeCode.Char:
return(V)(object)convertibleObj.ToChar(null);
//.........
default:
//Noneofthem,usethefollowingdefaultway..
break;
}
}
return(V)(object)obj;
}
不外这个办法看起来不仅很丑、很贫苦,功效上还达不到VB版。以是倡议您用到这类范例参数之间的转换,就用VB封装这一功效,然后做成dll供C#挪用吧。
经由研讨发明Convert.ChangeType办法已封装了IConvertible判别的那些代码,因而C#版可接纳这类写法:
staticVGenericCast<U,V>(Uobj)
{
return(V)Convert.ChangeType(obj,typeof(V));
}
不外它仍旧没有VB版的CType功效丰厚。别的我还发明了VB运转库的ChangeType另有撑持用户自界说范例转换运算符的功效。以是最终版本以下:
PublicFunctionGenericCast(OfU,V)(ByValobjAsU)AsV
Try
ReturnCType(DirectCast(obj,Object),V)
CatchexAsInvalidCastExceptionReturnDirectCast(_
CompilerServices.Conversions.ChangeType(obj,GetType(V)),V)
EndTry
EndFunction
无论谁倒了对双方阵营的粉丝们也是有害无益。 |
|