.NET:获取所有派生自特定类的类

4

我有一个自定义控件和一些从它派生的控件。 我需要获取当前程序集中所有派生自主类的类,并检查它们的属性。 如何完成这个任务?

3个回答

11
var type = typeof(MainClass);

var listOfDerivedClasses = Assembly.GetExecutingAssembly()
    .GetTypes()
    .Where(x => x.IsSubclassOf(type))
    .ToList();

foreach (var derived in listOfDerivedClasses)
{
   var attributes = derived.GetCustomAttributes(typeof(TheAttribute), true);

   // etc.
}

请注意,上面的代码假设MainClass在当前正在执行的程序集中(Assembly.GetExecutingAssembly)。如果不是这样,你将会遇到问题。 - Brady Holt
@Brady,不是这样的。这段代码查找当前执行程序集中从MainClass派生的类型——可以在同一个程序集中或不同的程序集中:这并不重要。 - Ben M

1

您可以使用反射:

Type baseType = ...
var descendantTypes =
    from type in baseType.Assembly.GetTypes()
    where !type.IsAbstract
       && type.IsSubclassOf(baseType)
       && type.IsDefined(typeof(TheCustomAttributeYouRequire), true)
    select type;

你可以从那里开始。


1
为什么要使用!type.IsAbstract?抽象类仍然可以是派生自另一个类的类。 - Brady Holt

0
为了找到另一个程序集中定义的类的导数(GetExecutingAssembly 不起作用),我使用了:
var asm = Assembly.GetAssembly(typeof(MyClass));
var listOfClasses = asm.GetTypes().Where(x => x.IsSubclassOf(typeof(MyClass)));

(为了节省滚动,分成两行)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接