使用.net反射来查找共同的祖先类

本文关键字:祖先 查找 net 反射 使用 | 更新日期: 2023-09-27 18:24:05

我有一个程序集,其中包含具有公共祖先类(在程序集中定义)的类型。在大多数情况下,公共祖先不是类的直接基类型。

我需要能够从这个程序集中的所有类型中筛选出具有这个共同祖先的类型。由于各种原因,我无法实例化类型(通常它们没有公共的构造函数签名),所以我必须从myAssembly.GetTypes()开始,检查类型本身的属性。换句话说,我必须处理类,而不是类的实例。

如何检查此集合中的每个类型,以确定它是否继承自所需的共同祖先?

稍后:不用担心,我现在有了。诀窍是实例化一个类型对象,该对象是来自程序集的祖先类型,例如

Type ancestor = assy.getType("myAncestorClassName", true, true);
Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(ancestor));

然而,这将不起作用:

Type[] interestingClasses = assy.GetTYypes().Where(t => t.IsSubclassOf(typeof(AncestorClass)));

因为,我认为,祖先类型是在另一个程序集中定义的,而不是在主程序集中。

很久很久以后。。。。感谢所有对此提供答案的人。一路上我被转移到了其他事情上,但我现在有了一个巧妙的解决方案(并学到了一些新的东西)。

使用.net反射来查找共同的祖先类

对于集合中的每个类型,您可以通过使用type.IsAssignableFrom.来查看它们是否源自此祖先

例如:

var types = assembly.GetTypes().Exclude(t => typeof(CommonAncestor).IsAssignableFrom(t));

这应该得到程序集中不是从CommonAncestor派生的所有类型。

使用Type.IsAssignableFrom来确定一个类型是否可以从另一个类型的实例中赋值。

假设您使用的是C#

Type[] types = myAssenbly.GetTypes();
foreach(Type t in types)
{
    // Is a Common Ancestor subclass
    bool isString = t.IsAssignableFrom(typeof(CommonAncestor));
}

查看以下片段:

var commonAncestor = typeof(object);
var descendants =
    Assembly.GetExecutingAssembly().GetTypes().Where(
    type => commonAncestor.IsAssignableFrom(type));

这将获取当前程序集中从object派生的所有类型。自然地,用你自己的共同祖先类型来代替它。

Type.IsAssignableFrom()方法检查您是否可以执行以下操作:

MyType b = new MyType();
object a = b;

没有错误。