在运行时,我想指定一个父类,然后程序将生成所有子类(无论多少代)的列表。例如,如果我Entity
作为父母, and Item:Entity
,Actor:Entity
就会有两个字符串,“Actor”和“Item”。
我看到这System.Reflection.TypeInfo
正是我正在寻找的。但是,这似乎是 .NET 4.5 独有的,不幸的是我的环境停留在 3.5。
在 .NET 3.5 中是否有其他方法可以做到这一点,或者我应该考虑升级吗?
在运行时,我想指定一个父类,然后程序将生成所有子类(无论多少代)的列表。例如,如果我Entity
作为父母, and Item:Entity
,Actor:Entity
就会有两个字符串,“Actor”和“Item”。
我看到这System.Reflection.TypeInfo
正是我正在寻找的。但是,这似乎是 .NET 4.5 独有的,不幸的是我的环境停留在 3.5。
在 .NET 3.5 中是否有其他方法可以做到这一点,或者我应该考虑升级吗?
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));
一种可能的方式是利用该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));
我目前没有可用的编译器,所以我无法验证它,但它应该是正确的
这是我用来在选定程序集中查找某个类(也可以是抽象类)的所有子类的方法:
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)
}
}
您可以使用以下代码:
var parrents = Assembly.GetExecutingAssembly().GetTypes().Where(a => typeof(Person).IsAssignableFrom(a)).ToList();