我有一个班级树。要正确加载它们,我需要知道特定实例的所有祖先类。即当加载一些特定的实例(这个)时,我还需要触发加载它所有的祖先类型。
目前我已通过顶级祖先之一的功能完成此操作,使用this.GetType()获取初始类型并将Type.BaseType收集到数组中。我也使用扩展方法对Type类做了同样的事情。这两个解决方案运行良好,但我有点担心我一直在重建这个数组(许多小子类都有专门的函数,每个子类有几个祖先)。
所以我一直在寻找替代方案。现在我正试图做这样的事情:
public static class AncestralTypes<T>
{
private static Type[] _All;
public static Type[] All { get { return _All ?? (_All =GetAllTypes());}}
private static Type[] GetAllTypes()
{
List<Type> all_types = new List<Type>();
var a = typeof(T);
all_types.Add(a);
var to = typeof(object);
if (a != to)
while ((a = a.BaseType) != to) // Iterate until we reach Object type ancestor
all_types.Add(a);
return all_types.ToArray();
}
}
只要我用
之类的语句测试这种方法AncestralTypes<MyCustomClass39>.All
效果非常好。它每种类型只触发一次生成(然后它被存储)。一切都很好看。
问题:我无法使用&#34来加载函数(在其中一个祖先中定义)中工作#t;&#34;关键词。它不会接受这个.GetType()。有没有办法发送&#34;这个&#34;对象变成这样的通用?我期待的是:
foreach(var t in AncestralTypes<this.GetType()>.All) DoJob(t);
上班。也许我错过了一些非常小的东西?
示例:
答案 0 :(得分:0)
感谢Mt.Schneiders和Magus,我做了5次aproaches测试,测试次数为500k(跑了好几次,计时器非常接近):
我决定保留#5(带静态字典的功能)方法。 Mt.Schneiders,如果你将你的字典建议作为一个单独的答案发布 - 我很乐意将其标记为解决方案。谢谢你们两位。
P.S。:决定不使用扩展方法,因为根据测试它看起来有点慢+它看起来更糟:customclassinstance.GetType()。GetAllTypes() - vss-customclassinstance.AllTypes
编辑:查看答案here我还决定尝试将基类定义为Base&lt; T&GT ;.自定义类看起来像“CustomClass:Base&lt; CustomClass&gt;”然后,这允许使用我最初想要的几乎相同的东西。 做了额外的测试:
答案 1 :(得分:0)
我的建议是维护一个静态字典,它将保存每个子类的祖先类型列表。它将用于缓存类型,因此避免重复构建列表,这将意味着一些性能增益。
这样的事情:
static Dictionary<string (TypeName), Type[]>