Ich habe einen Typ Typ, die ich eine Assembly für abgeleitete Typen durchsuchen möchte.So implementieren Sie IsAssignableFrom mit Mono.Cecil
Ich versuche Mono.Cecil zu verwenden, um die Baugruppe aus Leistungsgründen vorzuscannen. Das Scannen und Laden aller Assemblys dauert zu lange, und es wurde vorgeschlagen, dass cecil viel schneller einen Prescan durchführen kann, da nur ein Bruchteil der verfügbaren Assemblys passende Typen aufweist.
Bis jetzt habe ich die unten, die nur für Schnittstellen funktioniert.
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;
}
Wie könnte ich dies auch für Basisklassen erweitern?
Was meinst du mit 'Normal ', wenn Sie sich auf eine Klasse? – Igor
Ich meine nicht eine Schnittstelle. – bradgonesurfing
Die Formulierung "normale Klassen" wurde in "Basisklassen" geändert – bradgonesurfing