通过反射获得所有继承课程的单身人士

时间:2012-07-17 16:13:57

标签: c# .net reflection

我有以下情况:

class Cow : Animal
{
   public int animalID;
   private static Cow instance;
   public static Cow Instance
   {
      get 
      {  
          if (instance == null) instance = new Cow();
          return instance;     
      }
    }
   private Cow() { }
}

Cow是一个继承自Animal的普通单身人士。 我需要的是:Dictionary<int, Animal>包含从类型Animal继承的所有单例,这样,a)列表首先填充所有现有的单例[已经实例化],和b)添加的方法我的字典项目尚未实例化。

对于已实现的类Cow,Goat和Zebra我想要这种行为:

public class Cow : Animal { ... }
public class Goat : Animal { ... }
public class Zebra : Animal { ... }

public static class AnimalManagement
{
   static Dictionary<int, Animal> zoo = new Dictionary<int, Animal>();
   static void FillDictionary();
   static Animal GetAnimalID(int animalID);    
}

public Main()
{
   var a1 = Cow.Instance;
   var a2 = Goat.Instance;

   AnimalManagement.FillDictionary();
   // Now, zoo.Count() == 2

   // Suppose I seeking for Zebra, with animalID  == 5:
   Animal zebra = AnimalManagement.GetAnimalID(5);
   // Thus, zoo.Count() == 3 and zeebra singleton was 
   // instantiated and added to internal dic of AnimalManagement.
}

所以我想通过反思在运行时填写字典。 我的朋友有可能吗?

提前致谢!

2 个答案:

答案 0 :(得分:3)

本质:

var types = myAssembly.GetTypes(t => typeof(Animal).IsAssignableFrom(t) && !t.IsAbstract);
var instances = types.Select(t => t.GetProperty("Instance", B.Static).GetValue(null, null));

答案 1 :(得分:1)

虽然你可以,但是当你进行装配搜索时,反射通常很慢,甚至更慢。您是否可以使用元数据(某些DSL如XML)来实现您正在寻找的配置?

如果您仍想要反思,它将归结为这些步骤(伪代码):

  • 获取正在执行的程序集
  • 从程序集中获取模块
  • 从模块中获取type.BaseType == typeof(Animal)
  • 的类型
  • 一旦有了这些类型,就需要创建它们。您可以在类型上调用Instance方法,如果删除单例部分,则可以使用Activator(activator API)创建类型。无论哪种方式,您都可以获得Animal