正 文

.NET泛型技巧之类型参数之间的转换


www.7dspace.com  更新日期:2006-1-12 1:33:36  七度空间


  现在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

2页,页码:[1] [2] 

上一篇:Photoshop为漂亮MM白衫加印花草图案
下一篇:从细微之处做起 全面打造系统安全环境
标题:.NET泛型技巧之类型参数之间的转换 作者:装配脑袋 来源:博客堂 ( 责任编辑:7dspace )
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐