ray_linn 发表于 2013-2-4 21:08:22

C# 利用范型与扩展方法重构代码

在一些C#代码中常常可以看到
//An Simple Example By Ray Linnclass CarCollection :ICollection{    IList list;      public void Add(Car car)    {         list.Add(car);    }    .... function list for ICollection...      publicvoid listPrice()    {       foreach(Car car in list)         System.Console.WriteLin(car.Price);    }    ......more specifical function list...}class PetCollection :ICollection{    IList list;    public void Add(Pet pet)    {         list.Add(pet);    }    .... function list for ICollection...      publicvoid FeedPet()    {       foreach(Pet pet in list)         System.Console.WriteLin(pet.Eating());    }    ......more specifical function list...}

这样的代码在很多Open Source项目中是很经常看到的,比如Cecil,其共同特点是:某种特定类型的Collection+该Collection特殊的操作,在一个项目中可能充斥着数十个类似的Collection,类似的代码在Java中很难被重构,但是在C#中,却可以借助扩展方法与范型进行代码的精减。

首先创建范型的Collection,该例子可以用List<T>来代替,但作为例子,我们假设该List<T>是特殊的(可能有一些delegate)
Java代码

public CommonCollection<T>:ICollection<T>   {      IList<T> list         .... function list for ICollection...   }public CommonCollection<T>:ICollection<T>{   IList<T> list    .... function list for ICollection...}

对于Car和Pet的特殊操作,我们通过扩展方法来实现
public static class CarExt{    //Ext Function For CommonCollection<Car> by Ray Linn    public static void listPrice(this CommonCollection<Car> collection)    {       foreach(Car car in collection)         System.Console.WriteLin(car.Price);    }    ......more specifical function list...}public static class PetExt{      //Ext Function For CommonCollection<Pet> by Ray Linn    public static void FeedPet(this CommonCollection<Pet> collection)    {       foreach(Pet pet in list)         System.Console.WriteLin(pet.Eating());    }}

通过这样的方式,我们就实现了重构,两个Collection实现了求同存异。在我重构的Cecil之后,编译后的Assemly大小减小了一半.
页: [1]
查看完整版本: C# 利用范型与扩展方法重构代码