특정 형식 C #에서 상속되는 어셈블리의 모든 형식을 찾는 방법


92

특정 다른 유형에서 상속되는 모든 유형의 컬렉션을 어떻게 얻습니까?

답변:


150

다음과 같은 것 :

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.


2
감사! 나는이 감사를 사용하여 결국-이 공개 정적 List <Type> GetAllSubclassesOf (Type baseType) {return Assembly.GetAssembly (baseType) .GetTypes ()를 사용했습니다. 여기서 (유형 => type.IsSubclassOf (baseType)). ToList (); }
aceinthehole 2009-08-12

@Downvoter 여기. 내 댓글이 누락되었습니다. aceinthehole에서 알 수 있듯이 대답은 올바르지 않습니다. 코드가 작동하지 않을 때까지 에이스 주석을 놓쳤으므로 정답을 추가했습니다. 메리 크리스마스.
Tim Murphy

@ 팀 : 틀린 것이 아니라 약간 다릅니다. IsAssignableFrom잘 작동합니다. 특히 내 버전은 인터페이스도 처리합니다. 내 코드를 테스트 했나요? 내 대답이 실패한 경우는 무엇입니까?
Jon Skeet

1
@Jon. 당신의 메소드는 인터페이스를 처리합니다. 저는 VB 프로그래머이며 클래스를 상속하고 인터페이스를 구현합니다. 이것은 C #에서 다른가요? 내가 요구 한대로 질문은 유형을 구현하지 않는 유형을 상속하는 유형을 원하기 때문에 묻습니다.
Tim Murphy

2
@Tim : C #에서는 둘 다에 대해 ":"을 사용하지만 일반적으로 인터페이스를 유형의 상속 계층 구조의 일부로 간주합니다.
Jon Skeet

27

다음 메서드는 유형을 상속하는 유형 컬렉션을 가져옵니다.

씨#

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의 답변을 참조하십시오.


1

모든 유형을 열거하고 찾고있는 유형을 상속하는지 각 유형을 확인해야합니다.

이 질문에 있는 것과 같은 코드 가 유용 할 수 있습니다.


1

다음 방법을 사용해보십시오 (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();
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.