WEB开发网
开发学院软件开发C语言 c#扩展方法奇思妙用高级篇四:对扩展进行分组管理... 阅读

c#扩展方法奇思妙用高级篇四:对扩展进行分组管理

 2010-09-30 20:56:53 来源:WEB开发网   
核心提示: 代码比较长,先折叠起来,c#扩展方法奇思妙用高级篇四:对扩展进行分组管理(6),逐层打开分析吧!IExtension<V>只定义一个方法GetValue,用于将As<T>后将原始的值取出,三种方式都不完美,我会努力改进,ExtensionGroup定义了As<T&g

代码比较长,先折叠起来,逐层打开分析吧!

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一些。

三种方式都不完美,我会努力改进,大家多提些建议啊。

上一页  1 2 3 4 5 6 

Tags:扩展 方法 奇思

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接