静态泛型使用Type

时间:2014-03-18 15:40:15

标签: c# generics static

我有一个班级树。要正确加载它们,我需要知道特定实例的所有祖先类。即当加载一些特定的实例(这个)时,我还需要触发加载它所有的祖先类型。

目前我已通过顶级祖先之一的功能完成此操作,使用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);

上班。也许我错过了一些非常小的东西?

示例:

  • 我有类BaseClass,它定义了函数Load,它实际上使用了所有类型来正确初始化和存储派生
  • 我有类DerivedClass1,它继承自BaseClass
  • 我有类DerivedClass2,它也继承自BaseClass
  • 我创建了一些DerivedClass#的实例并调用了继承的Load函数,它应该使用&#34;这个&#34;关键字类型和所有祖先类型,以正确初始化所有内容。 所以我不能只使用特定的子类。

2 个答案:

答案 0 :(得分:0)

感谢Mt.Schneiders和Magus,我做了5次aproaches测试,测试次数为500k(跑了好几次,计时器非常接近):

  1. 其中一个祖先的功能(动态) - 302ms
  2. 类型(动态)的扩展方法 - 314ms
  3. 已知类型的静态通用(静态) - 25ms
  4. 未知类型的静态通用(通过反射) - 1069ms
  5. 1但添加了静态词典 - 41ms

  6. 我决定保留#5(带静态字典的功能)方法。 Mt.Schneiders,如果你将你的字典建议作为一个单独的答案发布 - 我很乐意将其标记为解决方案。谢谢你们两位。

    P.S。:决定不使用扩展方法,因为根据测试它看起来有点慢+它看起来更糟:customclassinstance.GetType()。GetAllTypes() - vss-customclassinstance.AllTypes

    编辑:查看答案here我还决定尝试将基类定义为Base&lt; T&GT ;.自定义类看起来像“CustomClass:Base&lt; CustomClass&gt;”然后,这允许使用我最初想要的几乎相同的东西。 做了额外的测试:

    • with Base&lt; T&GT;和静态类型[]属性 - 大约30ms。

答案 1 :(得分:0)

我的建议是维护一个静态字典,它将保存每个子类的祖先类型列表。它将用于缓存类型,因此避免重复构建列表,这将意味着一些性能增益。

这样的事情:

static Dictionary<string (TypeName), Type[]>
相关问题