[英]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)來實現您正在尋找的這種配置?
如果你仍然想要反思,它將歸結為這些步驟(偽代碼):
Instance
方法, 或者如果刪除單例部分,則可以使用Activator( 激活器API )創建類型。 無論哪種方式,你得到你的Animal
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.