使用Type的静态泛型

本文关键字:泛型 静态 Type 使用 | 更新日期: 2023-09-27 17:50:45

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

目前我已经通过顶层祖先中的一个函数完成了这一点,它使用this. gettype()获取初始类型并收集类型。BaseType转换为数组。我也做了同样的事情使用扩展方法类型类。这两种解决方案都工作得很好,但我有点担心我总是重新构建这个数组(许多带有专用函数的小子类,每个子类都有几个祖先)。

所以我一直在寻找替代方法。现在我正在尝试做这样的事情:

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

它工作得很好。每个类型只触发生成一次(然后存储)。一切看起来都很好。

问题:我无法使用"this"关键字在加载函数(定义在祖先之一)中工作。它不接受this.GetType()。是否有一种方法将"this"对象的类型发送到这样的泛型中?我希望是这样的:

foreach(var t in AncestralTypes<this.GetType()>.All) DoJob(t);

工作。也许我遗漏了一些非常小的东西?

的例子:

  • 我有一个类BaseClass,它定义了函数Load,它实际上使用这些所有类型来正确初始化和存储派生
  • 我有类派生class1,它继承自BaseClass
  • 我有类派生class2,它也继承自BaseClass
  • 我创建了一些derivedclass#的实例,并调用继承的Load函数,它应该使用"this"关键字类型和所有祖先类型来正确初始化一切。所以我不能使用特定的子类。

使用Type的静态泛型

我的建议是维护一个静态字典,它将保存每个子类的祖先类型列表。它将用于缓存类型,从而避免重复构建列表,这意味着性能会有所提高。

像这样:

static Dictionary<string (TypeName), Type[]>

多亏了mt . schneider和Magus,我用50万次测试测试了5种方法(运行了几次,计时器一直都很接近):

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

我决定保留#5(带静态字典的函数)方法。施耐德先生,如果你把你的字典建议作为一个单独的答案贴出来,我会很高兴把它标记为一个解决方案。不过还是要感谢你们俩。

注::决定不使用扩展方法,因为它只是有点慢,根据测试+它看起来更糟:customclassinstance. gettype (). getalltypes () -vs- customclassinstance。AllTypes

EDIT:查看这里的答案,我也决定尝试将基类定义为base 。自定义类看起来像"CustomClass: Base"然后,但这允许使用几乎相同的东西,我最初想要的。附加测试:

    与Base<
  • ;T>和静态类型[]属性-大约30毫秒。