c#高级编程之Type类扩展TypeHelper
Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型。下面的类就针对这些地方进行扩展。 Co
Type 类提供了大量的属性和方法,但在一些基础性开发工作中,Type类功能还有些欠缺,尤其上在处理泛型类型时,如可空类型和泛型集合类型。下面的类就针对这些地方进行扩展。

1 public static class TypeHelper 2 { 3 public static bool IsNullableType(this Type type) 4 { 5 return (((type != null) && type.IsGenericType) && 6 (type.GetGenericTypeDefinition() == typeof(Nullable<>))); 7 } 8 9 public static Type GetNonNullableType(this Type type) 10 { 11 if (IsNullableType(type)) 12 { 13 return type.GetGenericArguments()[0]; 14 } 15 return type; 16 } 17 18 public static bool IsEnumerableType(this Type enumerableType) 19 { 20 return (FindGenericType(typeof(IEnumerable<>), enumerableType) != null); 21 } 22 23 public static Type GetElementType(this Type enumerableType) 24 { 25 Type type = FindGenericType(typeof(IEnumerable<>), enumerableType); 26 if (type != null) 27 { 28 return type.GetGenericArguments()[0]; 29 } 30 return enumerableType; 31 } 32 33 public static bool IsKindOfGeneric(this Type type, Type definition) 34 { 35 return (FindGenericType(definition, type) != null); 36 } 37 38 public static Type FindGenericType(this Type definition, Type type) 39 { 40 while ((type != null) && (type != typeof(object))) 41 { 42 if (type.IsGenericType && (type.GetGenericTypeDefinition() == definition)) 43 { 44 return type; 45 } 46 if (definition.IsInterface) 47 { 48 foreach (Type type2 in type.GetInterfaces()) 49 { 50 Type type3 = FindGenericType(definition, type2); 51 if (type3 != null) 52 { 53 return type3; 54 } 55 } 56 } 57 type = type.BaseType; 58 } 59 return null; 60 } 61 }
从名字上就以大体知道方法的功能,下面是部分测试代码,帮助大家理解:

1 [TestMethod()] 2 public void IsNullableTypeTest() 3 { 4 Assert.AreEqual(true, TypeExtension.IsNullableType(typeof(int?))); 5 Assert.AreEqual(false, TypeExtension.IsNullableType(typeof(int))); 6 Assert.AreEqual(true, TypeExtension.IsNullableType(typeof(Nullable<DateTime>))); 7 Assert.AreEqual(false, TypeExtension.IsNullableType(typeof(DateTime))); 8 } 9 [TestMethod()] 10 public void GetNonNullableTypeTest() 11 { 12 Assert.AreEqual(typeof(int), TypeExtension.GetNonNullableType(typeof(int?))); 13 Assert.AreEqual(typeof(DateTime), TypeExtension.GetNonNullableType(typeof(Nullable<DateTime>))); 14 } 15 [TestMethod()] 16 public void IsEnumerableTypeTest() 17 { 18 Assert.AreEqual(true, TypeExtension.IsEnumerableType(typeof(IEnumerable<string>))); 19 Assert.AreEqual(true, TypeExtension.IsEnumerableType(typeof(Collection<int>))); 20 } 21 [TestMethod()] 22 public void GetElementTypeTest() 23 { 24 Assert.AreEqual(typeof(int), TypeExtension.GetElementType(typeof(IEnumerable<int>))); 25 Assert.AreEqual(typeof(DateTime), TypeExtension.GetElementType(typeof(Collection<DateTime>))); 26 } 27 [TestMethod()] 28 public void IsKindOfGenericTest() 29 { 30 Assert.AreEqual(true, TypeExtension.IsKindOfGeneric(typeof(List<string>), typeof(IEnumerable<>))); 31 Assert.AreEqual(true, TypeExtension.IsKindOfGeneric(typeof(string), typeof(IComparable<>))); 32 } 33 [TestMethod()] 34 public void FindGenericTypeTest() 35 { 36 Assert.AreEqual(typeof(IEnumerable<string>), 37 TypeExtension.FindGenericType(typeof(IEnumerable<>), typeof(List<string>))); 38 }
代码就是最好的文档,想必大家已经都看明白了。
精彩图集
精彩文章
热门标签
发布
知识
json数
特例化
地图区域
自适应高度
高频触
隐形字符
表格排序
递归函数
onload事件
多条数
清晰
标准库函数
乱码问题
死锁监控
弹出窗口
LoadUserProf
无限分级算法
七点忠告
抓包工具
安装配置
加
Authenticato
设计
absolute
木马攻击
生的
Connections_
你的
拥有组
过滤空格
幂
横屏
python列表操
深度
长文章分页
循环
js属性
js代码
unicode转码
开发Dynam
Androi
simsimi
stopPropagat
503服务
使
ArraySortUti
mater
pyv8学习
GUI
lpad
混淆加密
MP4
一个SOAP
CSimpleList
连接
ftp下载数据
xy坐标
overload
赞助商链接
@CopyRight 2002-2008, 1SOHU.COM, Inc. All Rights Reserved QQ:1010969229