특정 다른 유형에서 상속되는 모든 유형의 컬렉션을 어떻게 얻습니까?
특정 다른 유형에서 상속되는 모든 유형의 컬렉션을 어떻게 얻습니까?
답변:
다음과 같은 것 :
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
잘 작동합니다. 특히 내 버전은 인터페이스도 처리합니다. 내 코드를 테스트 했나요? 내 대답이 실패한 경우는 무엇입니까?
다음 메서드는 유형을 상속하는 유형 컬렉션을 가져옵니다.
씨#
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();
}