在写这篇文档的时候参考了网上的资料,下边是参考资料的网址

http://www.cnblogs.com/allenlooplee/archive/2005/06/14/174427.aspx

http://it-zero.com/empolder/every.asp?id=153&class1=2&class2=12

http://club.yesky.com/bbs/jsp/view.jsp?articleID=1672664

http://www.cnblogs.com/whxleem/articles/23800.html

 

下边是关于水果栏问题的代码,是由本人在参考了网上的资料后自己编写的,其中用到了反射中的Invoke方法和哈希表的一些知识。

 

下边是源代码

 

using System;

using System.Collections.Generic;

using System.Text;

using System.Reflection.Emit;

using System.Reflection;

using System.Collections;

 

namespace re

{

    

    

     class Program

     {

        

        

         static void Main(string[] args)

         {

              Fruits.ht.Add("Apple", Fruits.AppleList);//向水果栏中添加一个苹果列表

              Fruits.AppleList.Add(new Apple());//向苹果列表中添加两个苹果

              Fruits.AppleList.Add(new Apple());

              Fruits.BananaList.Add(new Banana());//向香蕉列表中添加三个香蕉

              Fruits.BananaList.Add(new Banana());

              Fruits.BananaList.Add(new Banana());

              Fruits.ht.Add("Banana", Fruits.BananaList);//在水果栏中添加一个香蕉列表

              Fruits yan = new Fruits();

             Banana  banan=new Banana();//再次加入一个香蕉

              banan.Add(banan);

              yan.Invoke(banan.GetType(), "Cut");//调用香蕉的Cut方法水果栏中有几个香蕉就调用几次CUT方法

              Apple apple = new Apple();

              yan.Invoke(apple.GetType(), "Core");//调用苹果的Core方法水果栏中有几个苹果就调用几次Core方法

              Watermelon watermelon = new Watermelon();//新添加一个西瓜列表

              Fruits fruits = new Fruits();

              fruits.Add(watermelon);//并添加一个西瓜

              watermelon.Invoke(watermelon.GetType(), "Clear");

             

 

 

         }

             

     }

     class Fruits

     {

 

         public static Hashtable ht = new Hashtable(200);//定义一个哈表来维护水果类

         public static ArrayList AppleList = new ArrayList();//定义一个苹果种类的列表

         public static ArrayList BananaList = new ArrayList();//定义一个香蕉种类的列表

         public Fruits()

         {

             

         }

         public virtual void Core()

         {

 

         }

         public virtual void Cut()

         {

 

         }

         public virtual void Clear()

         {

 

         }

         public void Add(Fruits fruit)

         {

 

 

              if (!this.Contain(fruit.GetType()))

              {

                   ArrayList fruitList = new ArrayList();//加一个水果筐

                   fruitList.Add(fruit);//在新加的水果筐中加入一个水果

                   ht.Add(fruit.ToString().Substring(3), fruitList);//加一个水果筐到哈希表中

              }

              else

              {

                   ((ArrayList)ht[fruit.GetType().ToString().Substring(3)]).Add(fruit);//向以有的水果栏中放入一个水果

              }

             

         }

         public bool Contain(Type fruit)

         {

              foreach (DictionaryEntry de in ht)

              {

                   if (fruit.ToString().Substring(3) == de.Key.ToString())//如果已经有了该种水果

                   {

                       return true;

                   }

              }

              return false;

         }

 

         public void Invoke(Type fruitType, string methodName)

         {

                      ArrayList fruitList =(ArrayList) ht [fruitType.Name];

                      BindingFlags bindingFlags = BindingFlags.Public |

                       BindingFlags.Instance |

                       BindingFlags.IgnoreCase |

                       BindingFlags.DeclaredOnly |

                       BindingFlags.InvokeMethod;

                       foreach (object obj in fruitList)//调用该类的每一个对象的方法

                       {

                            fruitType.InvokeMember(methodName, bindingFlags, null, obj, null);

                       }

         }

     }

     class Banana : Fruits

     {

         public override void Cut()

         {

              Console.WriteLine("Cut Myself");

         }

     }

     class Apple : Fruits

     {

         public override void Core()

         {

              Console.WriteLine("Core Myself");

         }

     }

     class Watermelon : Fruits

     {

         public override void Clear()

         {

              Console.WriteLine("Clear Myself");

         }

     }

}