c#扩展方法奇思妙用高级篇四:对扩展进行分组管理
2010-09-30 20:56:53 来源:WEB开发网代码比较长,先折叠起来,逐层打开分析吧!
IExtension<V>只定义一个方法GetValue,用于将As<T>后将原始的值取出。
ExtensionGroup定义了As<T>扩展,我们先看下值的传递过程。调用语句:"123".As<IConvertableString>().ToInt();
首先,"123" 是个字符串,As<IConvertableString>后转换成了IConvertableString接口的实例,ToInt时使用GetValue将"123"从IConvertableString接口的实例中取出进行处理。
关键在“IConvertableString接口的实例”,前面我们并没有具体实现IConvertableString接口的类,怎么出来的实例呢?我们这里用反射发出动态生成了一个实现IConvertableString接口的类。具体是由ExtensionGroup中的私有函数CreateType<T, V>完成的,在这里T传入的是IConvertableString,V传入的是string,返回的值就是实现了IConvertableString接口的一个类的Type.由CreateType<T, V>动态实现的类“模样”如下:
1 class ConvertableString : IConvertableString
2 {
3 private string value;
4 public ConvertableString(string value)
5 {
6 this.value = value;
7 }
8 public string GetValue()
9 {
10 return value;
11 }
12 }
如果此处不用反射发出动态生成这么一个,那么我们就要手工写一个,每个扩展组都要相应的写一个,很麻烦的。
为了提高性能,对反射发出的类型进行了缓存,保存在cache成员中。
方式三有点复杂,主要是因为我们是给sealed类进行扩展,无法从它们继承。
最后给出测试代码:
1 public static void Test()
2 {
3 int i = "123".As<IConvertableString>().ToInt();
4 DateTime d = "2009年8月29日".As<IConvertableString>().ToDateTime();
5 }
三种方式,我最喜欢第三种,它仅需要一个As<T>,而且是对接口进行扩展,感觉更OO一些。
三种方式都不完美,我会努力改进,大家多提些建议啊。
- ››扩展Axis2框架,支持基于JVM的脚本语言
- ››扩展WebSphere Portal V6个性化功能
- ››扩展JavaScript的时候,千万要保留其原来的所有功...
- ››扩展数据:如何为 Model 750 服务器选择 I/O 扩展...
- ››扩展 JDT 实现自动代码注释与格式化
- ››扩展 secldap 的功能以验证多个数据源
- ››扩展 JUnit4 以促进测试驱动开发
- ››扩展 JUnit 测试并行程序
- ››扩展的ToolStripEx控件
- ››扩展 Eclipse 的 Java 开发工具
- ››扩展 Eclipse 辅助和规范开发流程
- ››扩展方法 DataTable 和List 相互转换
更多精彩
赞助商链接