1

我有以下情况:

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。我需要的是:aDictionary<int, Animal>包含从 type 继承的所有单例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.
}

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

提前致谢!

4

2 回答 2

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));
于 2012-07-17T16:26:13.103 回答
1

尽管可以,但反射通常很慢,在进行汇编搜索时甚至更慢。您能否使用元数据(一些 DSL,如 XML)来实现您正在寻找的这种配置?

如果您仍然想要反射,它将归结为以下步骤(伪代码):

  • 获取执行程序集
  • 从您的程序集中获取模块
  • 从 type.BaseType == typeof(Animal) 的模块中获取类型
  • 拥有这些类型后,您需要创建它们。您可以在类型上调用Instance方法,或者如果您删除单例部分,您可以使用 Activator ( activator API ) 创建类型。无论哪种方式,你都会得到你的Animal.
于 2012-07-17T16:27:17.317 回答