现在VB的用户已经轻松享受这一功能了。但是C#的事情还没完,因为C#没有如此智能的类型转换运算符,因此就需要手工实现VB运行库所代办的那些任务。其实就是利用了一下IConvertible:
static V GenericCast<U, V>(U obj)
{
IConvertible convertibleObj = obj as IConvertible;
if (convertibleObj != null)
{
Type t = typeof(V);
switch (Type.GetTypeCode(t))
{
case TypeCode.Boolean:
return (V)(object)convertibleObj.ToBoolean(null);
case TypeCode.Byte:
return (V)(object)convertibleObj.ToByte(null);
case TypeCode.Char:
return (V)(object)convertibleObj.ToChar(null);
//.........
default:
//None of them, use the following default way..
break;
}
}
return (V)(object)obj;
}
不过这个方法看起来不但很丑、很麻烦,功能上还达不到VB版。所以建议您用到这种类型参数之间的转换,就用VB封装这一功能,然后做成dll供C#调用吧。
经过研究发现Convert.ChangeType方法已经封装了IConvertible判断的那些代码,因此C#版可采用这种写法:
static V GenericCast<U, V>(U obj)
{
return (V)Convert.ChangeType(obj, typeof(V));
}
不过它仍然没有VB版的CType功能丰富。此外我还发现了VB运行库的ChangeType还有支持用户自定义类型转换运算符的功能。所以终极版本如下:
Public Function GenericCast(Of U, V)(ByVal obj As U) As V
Try
Return CType(DirectCast(obj, Object), V)
Catch ex As InvalidCastException Return DirectCast( _
CompilerServices.Conversions.ChangeType(obj, GetType(V)), V)
End Try
End Function
