簡體   English   中英

通過反射獲得所有繼承課程的單身人士

[英]Get all singletons that inherit a class via 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.
}

所以我想通過反思在運行時填寫字典。 我的朋友有可能嗎?

提前致謝!

實質上:

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

雖然你可以,但反射通常很慢,而且在你進行裝配搜索時甚至更慢。 您是否可以使用元數據(某些DSL,如XML)來實現您正在尋找的這種配置?

如果你仍然想要反思,它將歸結為這些步驟(偽代碼):

  • 獲取執行程序集
  • 從裝配中獲取模塊
  • 從模塊中獲取類型,其中type.BaseType == typeof(Animal)
  • 擁有這些類型后,您需要創建它們。 您可以在類型上調用Instance方法, 或者如果刪除單例部分,則可以使用Activator( 激活器API )創建類型。 無論哪種方式,你得到你的Animal

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM