C#中是否可以从基类中获取子类的类型?
答案 0 :(得分:27)
你可以这样做:
var subclassTypes = Assembly
.GetAssembly(typeof(BaseClass))
.GetTypes()
.Where(t => t.IsSubclassOf(typeof(BaseClass)));
答案 1 :(得分:25)
不是直接的,但是您可以使用AppDomain.GetAssemblies()来获取所有当前加载的程序集,然后使用Assembly.GetTypes()来获取该程序集中的所有类型。然后使用Type.IsSubclassOf()确定它是否是您所追求的类型的子类。
答案 2 :(得分:5)
您可以选择要检查的程序集,使用方法Assembly.GetTypes()
获取类型,如果它是具有Type.IsSubclassOf()
答案 3 :(得分:3)
试试这段代码:
public static IEnumerable<Type> GetAllSubclassOf(Type parent)
{
foreach (var a in AppDomain.CurrentDomain.GetAssemblies())
foreach (var t in a.GetTypes())
if (t.IsSubclassOf(parent)) yield return t;
}
答案 4 :(得分:0)
请参阅以下示例代码,该示例代码与其他代码相似,不同之处在于它不使用lambda表达式和扩展方法,并在Microsoft Visual Studio 2017控制台应用程序中使用特定类进行了测试。
有关更多详细信息,请参见其注释,输出和屏幕截图。
C#
// Get all the types in your assembly. For testing purpose, I am using Aspose.3D, you can use any.
var allTypes = Assembly.GetAssembly(typeof(Aspose.ThreeD.Formats.SaveOptions)).GetTypes();
foreach(var myType in allTypes)
{
// Check if this type is subclass of your base class
bool isSubType = myType.IsSubclassOf(typeof(Aspose.ThreeD.Formats.SaveOptions));
// If it is sub-type, then print its name in Debug window.
if (isSubType)
{
System.Diagnostics.Debug.WriteLine(myType.Name);
}
}
输出
AMFSaveOptions
ColladaSaveOptions
Discreet3DSSaveOptions
DracoSaveOptions
FBXSaveOptions
GLTFSaveOptions
HTML5SaveOptions
ObjSaveOptions
PdfSaveOptions
PlySaveOptions
RvmSaveOptions
STLSaveOptions
U3DSaveOptions