4

在运行时,我想指定一个父类,然后程序将生成所有子类(无论多少代)的列表。例如,如果我Entity作为父母, and Item:EntityActor:Entity就会有两个字符串,“Actor”和“Item”。

我看到这System.Reflection.TypeInfo正是我正在寻找的。但是,这似乎是 .NET 4.5 独有的,不幸的是我的环境停留在 3.5。

在 .NET 3.5 中是否有其他方法可以做到这一点,或者我应该考虑升级吗?

4

4 回答 4

8
var pType = typeof(Entity);
IEnumerable<string> children = Enumerable.Range(1, iterations)
   .SelectMany(i => Assembly.GetExecutingAssembly().GetTypes()
                    .Where(t => t.IsClass && t != pType
                            && pType.IsAssignableFrom(t))
                    .Select(t => t.Name));

演示

于 2012-12-15T22:36:55.717 回答
4

一种可能的方式是利用该Type.IsAssignableFrom方法。您将遍历所有类型,并选择那些为真的类型。

基本上,它会像

Type parent = Type.GetType("Entity");
Type[] types = Assembly.GetExecutingAssembly().GetTypes(); // Maybe select some other assembly here, depending on what you need
Type[] inheritingTypes = types.Where(t => parent.IsAssignableFrom(t));

我目前没有可用的编译器,所以我无法验证它,但它应该是正确的

于 2012-12-15T22:24:00.463 回答
0

这是我用来在选定程序集中查找某个类(也可以是抽象类)的所有子类的方法:

public class InheritedFinder
{
    public static Type[] FindInheritedTypes(
        Type parentType, Assembly assembly)
    {
        Type[] allTypes = assembly.GetTypes();
        ArrayList avTypesAL = new ArrayList();

        return allTypes.Where(
            t => parentType.IsAssignableFrom(t) && t != parentType).ToArray();
    }
}

只需致电

var availableTypes = InheritedFinder.FindInheritedTypes(
        typeof(YourBaseClass),
        System.Reflection.Assembly.GetExecutingAssembly());

这将为您提供 YourBaseClass 的可用子项列表。这样做的好处是——它还可以找到孩子的孩子,所以你可以使用多层次的抽象类。如果您需要创建每个孩子的实例,很简单:

var availableTypes= InheritedFinder.FindInheritedTypes(
    typeof(Shape), System.Reflection.Assembly.GetExecutingAssembly());
foreach (var t in availableTypes)
{
    try
    {
        YourBaseClass nInstance = (YourBaseClass)Activator.CreateInstance(t);
        //nInstance is now real instance of some children
    }
    catch (Exception e)
    {
        //recommended to keep here - it'll catch exception in case some class is abstract (=can't create its instance)
    }
}
于 2020-03-30T14:22:24.710 回答
0

您可以使用以下代码:

var parrents = Assembly.GetExecutingAssembly().GetTypes().Where(a => typeof(Person).IsAssignableFrom(a)).ToList();
于 2021-10-17T17:09:09.900 回答