1
유형 유형 파생 형식의 어셈블리를 검색하고 싶습니다.Mono.Cecil을 사용하여 IsAssignableFrom을 구현하는 방법
Mono.Cecil을 사용하여 성능상의 이유로 어셈블리를 사전 검사하려고합니다. 모든 어셈블리 스캔 및 로딩 작업이 너무 오래 걸리며 사용 가능한 어셈블리의 일부분 만 일치하는 유형으로 사전 검사를 수행하는 것이 훨씬 쉽습니다.
지금까지 인터페이스에 대해서만 작동하는 아래 항목이 있습니다.
private static IEnumerable<Type> MatchingTypesFromDll<TParent>(string dllPath)
{
var type = typeof(TParent);
if (!type.IsInterface)
throw new Exception("Only interfaces supported");
try
{
var assDef = Mono.Cecil.AssemblyDefinition.ReadAssembly(dllPath);
var types = assDef.Modules.SelectMany(m => m.GetTypes());
if (types.Any(t => t.Interfaces.Any(i=>i.FullName == type.FullName)))
{
var assembly = Assembly.LoadFrom(dllPath);
return assembly
.GetExportedTypes()
.Where(TypeSatisfies<TParent>);
}
else
{
return new Type[] {};
}
}
catch (Exception e)
{
return new Type[] { };
}
}
private static bool TypeSatisfies<TParent>(Type type)
{
return typeof (TParent).IsAssignableFrom(type)
&& !type.IsAbstract
&& !type.IsInterface;
}
기본 클래스에서도이 기능을 확장 할 수 있습니까?
이하 수업? – Igor
인터페이스가 아닙니다. – bradgonesurfing
"일반 클래스"라는 단어를 "기본 클래스" – bradgonesurfing