반응형
모든 어셈블리에서 유형 찾기
웹 사이트 또는 Windows 앱의 모든 어셈블리에서 특정 형식을 찾아야합니다. 이렇게하는 쉬운 방법이 있습니까? ASP.NET MVC의 컨트롤러 팩토리가 컨트롤러의 모든 어셈블리를 살펴 보는 것과 같습니다.
감사.
이를 달성하기위한 두 단계가 있습니다.
- 는
AppDomain.CurrentDomain.GetAssemblies()
당신에게 현재 응용 프로그램 도메인에로드 된 모든 어셈블리를 제공합니다. - 이
Assembly
클래스는GetTypes()
특정 어셈블리 내의 모든 형식을 검색 하는 메서드를 제공합니다 .
따라서 코드는 다음과 같습니다.
foreach (Assembly a in AppDomain.CurrentDomain.GetAssemblies())
{
foreach (Type t in a.GetTypes())
{
// ... do something with 't' ...
}
}
특정 유형 (예 : 주어진 인터페이스 구현, 공통 조상으로부터 상속)을 찾으려면 결과를 필터링해야합니다. 애플리케이션의 여러 위치에서이 작업을 수행해야하는 경우 다른 옵션을 제공하는 도우미 클래스를 빌드하는 것이 좋습니다. 예를 들어, 저는 일반적으로 네임 스페이스 접두사 필터, 인터페이스 구현 필터 및 상속 필터를 적용했습니다.
자세한 문서는 여기 와 여기에서 MSDN을 살펴보십시오 .
Linq를 사용하여 쉽게 :
IEnumerable<Type> types =
from a in AppDomain.CurrentDomain.GetAssemblies()
from t in a.GetTypes()
select t;
foreach(Type t in types)
{
...
}
어셈블리가 동적인지 확인하는 LINQ 솔루션 :
/// <summary>
/// Looks in all loaded assemblies for the given type.
/// </summary>
/// <param name="fullName">
/// The full name of the type.
/// </param>
/// <returns>
/// The <see cref="Type"/> found; null if not found.
/// </returns>
private static Type FindType(string fullName)
{
return
AppDomain.CurrentDomain.GetAssemblies()
.Where(a => !a.IsDynamic)
.SelectMany(a => a.GetTypes())
.FirstOrDefault(t => t.FullName.Equals(fullName));
}
Most commonly you're only interested in the assemblies that are visible from the outside. Therefor you need to call GetExportedTypes() But besides that a ReflectionTypeLoadException can be thrown. The following code takes care of these situations.
public static IEnumerable<Type> FindTypes(Func<Type, bool> predicate)
{
if (predicate == null)
throw new ArgumentNullException(nameof(predicate));
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
{
if (!assembly.IsDynamic)
{
Type[] exportedTypes = null;
try
{
exportedTypes = assembly.GetExportedTypes();
}
catch (ReflectionTypeLoadException e)
{
exportedTypes = e.Types;
}
if (exportedTypes != null)
{
foreach (var type in exportedTypes)
{
if (predicate(type))
yield return type;
}
}
}
}
}
참고URL : https://stackoverflow.com/questions/4692340/find-types-in-all-assemblies
반응형
'IT박스' 카테고리의 다른 글
사용자 영역 프록시 시작 오류 : 0.0.0.0:80에 대한 바인딩 : 예기치 않은 오류 권한이 거부되었습니다. (0) | 2020.12.15 |
---|---|
중첩 클래스에서 포함하는 클래스의 필드에 액세스하는 가장 좋은 방법은 무엇입니까? (0) | 2020.12.15 |
CSS3 열-강제 중단 / 분할 요소? (0) | 2020.12.14 |
symfony2 및 doctrine을 사용하여 기존 데이터베이스에서 단일 엔티티 생성 (0) | 2020.12.14 |
UICollectionView 가로 페이징 스크롤 뷰에서 누락 된 논리 정렬 (0) | 2020.12.14 |