У меня есть тип Type, который я хочу найти в сборке для производных типов.
Я пытаюсь использовать Mono.Cecil для предварительного сканирования сборки по соображениям производительности. Сканирование и загрузка всех сборок занимает слишком много времени, и было высказано предположение, что 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;
}
Как я могу расширить это, чтобы работать и с базовыми классами?
normal
, когда вы ссылаетесь на класс? - person Igor   schedule 13.10.2016