คุณจะได้รับคอลเลกชันทุกประเภทที่สืบทอดมาจากประเภทอื่น ๆ ได้อย่างไร?
คุณจะได้รับคอลเลกชันทุกประเภทที่สืบทอดมาจากประเภทอื่น ๆ ได้อย่างไร?
คำตอบ:
สิ่งที่ต้องการ:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}
หากคุณต้องการจัดการกับยาชื่อสามัญสิ่งนั้นจะค่อนข้างยุ่งยากกว่า (เช่นการส่งในList<>
ประเภทเปิดแต่คาดหวังว่าจะได้รับประเภทที่มาจากList<int>
) อย่างอื่นมันง่ายมาก :)
หากคุณต้องการแยกประเภทออกคุณสามารถทำได้อย่างง่ายดายพอ:
public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
return assembly.GetTypes().Where(t => t != baseType &&
baseType.IsAssignableFrom(t));
}
โปรดทราบว่าสิ่งนี้จะช่วยให้คุณสามารถระบุอินเทอร์เฟซและค้นหาทุกประเภทที่ใช้งานได้แทนที่จะทำงานกับคลาสเหมือนที่Type.IsSubclassOf
ทำ
IsAssignableFrom
ควรทำงานเช่นกัน โดยเฉพาะเวอร์ชันของฉัน copes กับอินเทอร์เฟซเช่นกัน คุณทดสอบรหัสของฉันหรือไม่? คำตอบของฉันล้มเหลวในกรณีใด
วิธีการต่อไปนี้จะได้รับคอลเลกชันประเภทที่สืบทอดประเภท
ค#
public IEnumerable<Type> FindSubClassesOf<TBaseType>()
{
var baseType = typeof(TBaseType);
var assembly = baseType.Assembly;
return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
}
VB.NET
Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type)
Dim baseType = GetType(TBaseType)
Dim assembly = baseType.Assembly
Return From t In assembly.GetTypes()
Where t.IsSubClassOf(baseType)
Select t
End Function
หากคุณต้องการรวมประเภทที่ใช้อินเทอร์เฟซโปรดดูคำตอบของ @Jon Skeet
คุณต้องแจกแจงทุกประเภทและตรวจสอบว่าสืบทอดประเภทที่คุณกำลังมองหาหรือไม่
รหัสบางอย่างเช่นในคำถามนี้อาจเป็นประโยชน์สำหรับคุณ
ลองใช้วิธีนี้ (เขียนสำหรับ PCL):
public IEnumerable<Type> FindDerivedTypes( Assembly assembly, Type baseType )
{
TypeInfo baseTypeInfo = baseType.GetTypeInfo();
bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface;
return
from type in assembly.DefinedTypes
where isClass ? type.IsSubclassOf( baseType ) :
isInterface ? type.ImplementedInterfaces.Contains( baseTypeInfo.AsType() ) : false
select type.AsType();
}