我有以下情况:
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.
}
所以我想通过反思在运行时填写字典。 我的朋友有可能吗?
提前致谢!
答案 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)来实现您正在寻找的配置?
如果您仍想要反思,它将归结为这些步骤(伪代码):
Instance
方法,如果删除单例部分,则可以使用Activator(activator API)创建类型。无论哪种方式,您都可以获得Animal
。