使用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"关键字类型和所有祖先类型来正确初始化一切。所以我不能使用特定的子类。
我的建议是维护一个静态字典,它将保存每个子类的祖先类型列表。它将用于缓存类型,从而避免重复构建列表,这意味着性能会有所提高。
像这样:
static Dictionary<string (TypeName), Type[]>
多亏了mt . schneider和Magus,我用50万次测试测试了5种方法(运行了几次,计时器一直都很接近):
- 一个祖先的函数(动态)- 302ms
- 类型扩展方法(动态)- 314ms
- 已知类型的静态通用(静态)- 25ms
- 未知类型的静态泛型(通过反射)- 1069ms
-
1,但添加了静态字典- 41ms
我决定保留#5(带静态字典的函数)方法。施耐德先生,如果你把你的字典建议作为一个单独的答案贴出来,我会很高兴把它标记为一个解决方案。不过还是要感谢你们俩。
注::决定不使用扩展方法,因为它只是有点慢,根据测试+它看起来更糟:customclassinstance. gettype (). getalltypes () -vs- customclassinstance。AllTypes
EDIT:查看这里的答案,我也决定尝试将基类定义为base
- 与Base<
- ;T>和静态类型[]属性-大约30毫秒。