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

时间:2012-02-09 12:39:46

标签: c# reflection

我有一个包含具有共同祖先类的类型的程序集(在程序集中定义。共同的祖先在大多数情况下该类的直接基类型。

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

如何检查此集合中的每个Type以查找它是否继承自所需的共同祖先?

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

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)));

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

很久以后......感谢所有为此做出贡献的人。在此过程中我被转移到其他东西,但我现在有一个简洁的解决方案(并且已经学到了新的东西)。

4 个答案:

答案 0 :(得分:4)

对于集合中的每种类型,您可以使用Type.IsAssignableFrom查看它们是否来自此祖先。

例如:

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

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

答案 1 :(得分:2)

使用Type.IsAssignableFrom查明是否可以从另一种类型的实例分配一种类型。

答案 2 :(得分:1)

假设您正在使用C#

Type[] types = myAssenbly.GetTypes();

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

答案 3 :(得分:1)

查看此代码段:

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

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

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

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

没有错误。