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

时间:2024-04-26 18:07:28

在一些C#代码中常常可以看到

  1. //An Simple Example By Ray Linn
  2. class CarCollection :ICollection
  3. {
  4. IList list;
  5. public void Add(Car car)
  6. {
  7. list.Add(car);
  8. }
  9. .... function list for ICollection...
  10. public  void listPrice()
  11. {
  12. foreach(Car car in list)
  13. System.Console.WriteLin(car.Price);
  14. }
  15. ......more specifical function list...
  16. }
  17. class PetCollection :ICollection
  18. {
  19. IList list;
  20. public void Add(Pet pet)
  21. {
  22. list.Add(pet);
  23. }
  24. .... function list for ICollection...
  25. public  void FeedPet()
  26. {
  27. foreach(Pet pet in list)
  28. System.Console.WriteLin(pet.Eating());
  29. }
  30. ......more specifical function list...
  31. }

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

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

  1. public CommonCollection<T>:ICollection<T>
  2. {
  3. IList<T> list
  4. .... function list for ICollection...
  5. }
  6. public CommonCollection<T>:ICollection<T>
  7. {
  8. IList<T> list
  9. .... function list for ICollection...
  10. }

对于Car和Pet的特殊操作,我们通过扩展方法来实现

  1. public static class CarExt
  2. {
  3. //Ext Function For CommonCollection<Car> by Ray Linn
  4. public static void listPrice(this CommonCollection<Car> collection)
  5. {
  6. foreach(Car car in collection)
  7. System.Console.WriteLin(car.Price);
  8. }
  9. ......more specifical function list...
  10. }
  11. public static class PetExt
  12. {
  13. //Ext Function For CommonCollection<Pet> by Ray Linn
  14. public static void FeedPet(this CommonCollection<Pet> collection)
  15. {
  16. foreach(Pet pet in list)
  17. System.Console.WriteLin(pet.Eating());
  18. }
  19. }

通过这样的方式,我们就实现了重构,两个Collection实现了求同存异。在我重构的Cecil之后,编译后的Assemly大小减小了一半.