有的时候,我们需要获取某个基类中的所有子类,从而进行统一管理。这里有一个简单易行的实现:
class Program
{
static void Main(string[] args)
{
var subTypeQuery = from t in Assembly.GetExecutingAssembly().GetTypes()
where IsSubClassOf(t, typeof(Base))
select t;
foreach (var type in subTypeQuery)
{
Console.WriteLine(type);
}
}
static bool IsSubClassOf(Type type, Type baseType)
{
var b = type.BaseType;
while (b!=null)
{
if (b.Equals(baseType))
{
return true;
}
b = b.BaseType;
}
return false;
}
}
public class Base { }
public class Sub1 : Base { }
public class Sub2 : Base { }
public class Sub3 : Sub1 { }
{
static void Main(string[] args)
{
var subTypeQuery = from t in Assembly.GetExecutingAssembly().GetTypes()
where IsSubClassOf(t, typeof(Base))
select t;
foreach (var type in subTypeQuery)
{
Console.WriteLine(type);
}
}
static bool IsSubClassOf(Type type, Type baseType)
{
var b = type.BaseType;
while (b!=null)
{
if (b.Equals(baseType))
{
return true;
}
b = b.BaseType;
}
return false;
}
}
public class Base { }
public class Sub1 : Base { }
public class Sub2 : Base { }
public class Sub3 : Sub1 { }
原理很简单,通过反射获取某个Assembly下所有类型,然后将其基类依次对比。效率自然是很差,如果不是频繁使用的话则是一种行之有效的方法。当然,如果需要频繁使用,可以通过程序中的硬编码实现,虽然不容易维护,但效率上比这个是要高太多倍的。