如何动态获取所有具有指定 class 名称(或通过继承)的现有 classes?
How to get all existing classes with specified class name (or by inheritance) dynamically?
例如,我制作了父级 class CFilter,然后我制作了一些具有相似 class 名称的子级 classes,例如 CFilterNoise、CFilterLines、CFilterFillColor。
我现在不知道我将来会制作多少 classes,但我想为每个 class 创建一个实例,名称为 CFilter*,或者 CFilter 的所有子项在 FOR 或 WHILE 循环中创建一次开始。
我该怎么做?
也许您可以查看程序集以找到所有继承 CFilter 的 class :
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())// get all assemblies
{
foreach (Type t in a.GetTypes()) // get all types in the assembly
{
if( t.IsSubclassOf(typeof(CFilter) ) )// if the type inherit CFilter
{
var instance = (CFilter)Activator.CreateInstance(t);// create an instance ( with the default constructor ) of the type
// use 'instance'
}
}
}
您将无法根据其名称自动为每个 class 创建一个。但是您可以检查 class 是否实现了您想要的接口。你甚至可以把它写成一个扩展方法。
bool IsAFilter<T>(this T myobject)
{
return (typeof(T).IsAssignableFrom(typeof(CFilter))
}
使用 IsAssignableFrom 会告诉您 class 您是否实现了 CFilter。
例如,我制作了父级 class CFilter,然后我制作了一些具有相似 class 名称的子级 classes,例如 CFilterNoise、CFilterLines、CFilterFillColor。 我现在不知道我将来会制作多少 classes,但我想为每个 class 创建一个实例,名称为 CFilter*,或者 CFilter 的所有子项在 FOR 或 WHILE 循环中创建一次开始。 我该怎么做?
也许您可以查看程序集以找到所有继承 CFilter 的 class :
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())// get all assemblies
{
foreach (Type t in a.GetTypes()) // get all types in the assembly
{
if( t.IsSubclassOf(typeof(CFilter) ) )// if the type inherit CFilter
{
var instance = (CFilter)Activator.CreateInstance(t);// create an instance ( with the default constructor ) of the type
// use 'instance'
}
}
}
您将无法根据其名称自动为每个 class 创建一个。但是您可以检查 class 是否实现了您想要的接口。你甚至可以把它写成一个扩展方法。
bool IsAFilter<T>(this T myobject)
{
return (typeof(T).IsAssignableFrom(typeof(CFilter))
}
使用 IsAssignableFrom 会告诉您 class 您是否实现了 CFilter。