문제

반사를 사용하여 최소한의 코드로 C # 3.0 / .NET 3.5로 인터페이스를 구현하고 반복을 최소화하는 모든 유형을 어떻게 얻을 수 있습니까?

다시 작성하고 싶은 내용입니다. 라코 디스

도움이 되었습니까?

해결책

C # 3.0에서는 내 것이 될 것입니다 :) 라코 디스

기본적으로 최소 반복 횟수는 항상 다음과 같습니다. 라코 디스

다른 팁

이것은 저에게 효과적이었습니다.클래스를 반복하고 myInterface에서 파생되었는지 확인합니다. 라코 디스

IFoo 인터페이스를 구현하는 어셈블리에서 모든 유형을 찾으려면 : 라코 디스

Ryan Rinaldi의 제안이 잘못되었습니다.0 유형을 반환합니다.쓸 수 없습니다 라코 디스

유형은 System.Type 인스턴스이고 IFoo 유형이 아니기 때문입니다.대신 IFoo가 유형에서 할당 가능한지 확인합니다.예상 한 결과를 얻을 수 있습니다.

또한 현재 답변으로 표시된 Adam Wright의 제안도 같은 이유로 잘못된 것입니다.모든 System.Type 인스턴스가 IFoo 구현자가 아니었기 때문에 런타임에 0 유형이 반환되는 것을 볼 수 있습니다.

이것은 매우 오래된 질문이라는 점에 감사하지만 현재까지의 모든 답변이 Assembly.GetTypes .

GetTypes ()는 실제로 모든 유형을 반환하지만 반드시 활성화 할 수 있다는 의미는 아니므로 잠재적으로 ReflectionTypeLoadException .

유형을 활성화 할 수없는 고전적인 예는 반환 된 유형이 derivedbase이지만 base가 호출 어셈블리가 참조하지 않는 어셈블리 인 derived의 어셈블리와 다른 어셈블리에 정의 된 경우입니다.

그렇다면 우리가 가지고 있다고 가정 해 봅시다 : 라코 디스

ClassC에있는 AssemblyC에서 우리는 받아 들여진 대답에 따라 무언가를합니다 : 라코 디스

그런 다음 ReflectionTypeLoadException .

이는 AssemblyAAssemblyC에 대한 참조가 없으면 다음을 수행 할 수 없기 때문입니다. 라코 디스

즉, ClassB는 GetTypes에 대한 호출이 확인하고 발생하는 로드 할 수 가 아닙니다.

따라서이 Phil Haacked 문서 어셈블리에서 모든 유형 가져 오기 Jon Skeet 코드 대신 다음과 같은 작업을 수행합니다. 라코 디스

다음 : 라코 디스

여기에있는 다른 답변은 IsAssignableFrom를 사용합니다.FindInterfaces 네임 스페이스의 System를 사용할 수도 있습니다.="nofollow noreferrer"> 여기 .

다음은 현재 실행중인 어셈블리 폴더의 모든 어셈블리를 확인하여 특정 인터페이스를 구현하는 클래스를 찾는 예입니다 (명확성을 위해 LINQ를 사용하지 않음). 라코 디스

둘 이상을 일치 시키려면 인터페이스 목록을 설정할 수 있습니다.

로드 된 모든 어셈블리를 반복하고, 모든 유형을 반복하고, 인터페이스를 구현하는지 확인합니다.

예 : 라코 디스

이 방법은 저에게 효과적이었습니다 (조회에서 시스템 유형을 제외 할 수있는 경우) : 라코 디스

편집 : 원래 질문이 반복 / 코드의 감소를위한 것이었고 연습 으로서는 모두 훌륭하고 훌륭하지만 실제 상황에서는 가장 빠른기본 LINQ가 얼마나 멋진 지에 관계없이 구현합니다.

다음은로드 된 유형을 반복하는 Utils 메소드입니다.일반 클래스와 인터페이스를 처리하며, excludeSystemTypes 옵션은 자체 / 타사 코드베이스에서 구현을 찾고있는 경우 작업 속도를 크게 향상시킵니다. 라코 디스

예쁘지 않습니다. 인정하겠습니다.

다른 답변은 일반 인터페이스 에서 작동하지 않았습니다.

이것은 typeof (ISomeInterface)를 typeof (T)로 대체합니다. 라코 디스

그래서 라코 디스

우리는 모든 어셈블리를 얻습니다 라코 디스

인터페이스와 추상을 제외하는 데 사용되며 라코 디스

목록에 포함합니다.

성능 측면에서 원하는 작업을 쉽게 수행 할 수있는 방법은 없습니다.

반사는 주로 어셈블리 및 유형에서 작동하므로 모든 유형의 어셈블리를 가져 와서 올바른 인터페이스를 쿼리해야합니다.다음은 예입니다. 라코 디스

MyAssembly 어셈블리에서 IMyInterface를 구현하는 모든 유형을 얻을 수 있습니다.

어셈블리 위치를 선택할 때 더욱 좋습니다.구현 된 모든 인터페이스가 동일한 Assembly.DefinedTypes 내에 있다는 것을 알고있는 경우 대부분의 어셈블리를 필터링합니다. 라코 디스

Can Bilgin 제작

linq 코드에 예외가있어서 다음과 같이합니다 (복잡한 확장자없이) : 라코 디스

일부 LINQ를 사용하여 목록을 가져올 수 있습니다. 라코 디스

하지만 실제로 더 읽기 쉬운가요?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top