D'autres réponses ici utiliser IsAssignableFrom
. Vous pouvez également utiliser FindInterfaces
de la System
d'espace de noms, comme décrit ici.
Voici un exemple qui vérifie que toutes les assemblées en cours d'exécution de l'assemblée dossier, à la recherche pour les classes qui implémentent une interface particulière (en évitant de LINQ pour plus de clarté).
static void Main()
{
const string qualifiedInterfaceName = "Interfaces.IMyInterface";
var interfaceFilter = new TypeFilter(InterfaceFilter);
var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
var di = new DirectoryInfo(path);
foreach (var file in di.GetFiles("*.dll"))
{
try
{
var nextAssembly = Assembly.ReflectionOnlyLoadFrom(file.FullName);
foreach (var type in nextAssembly.GetTypes())
{
var myInterfaces = type.FindInterfaces(interfaceFilter, qualifiedInterfaceName);
if (myInterfaces.Length > 0)
{
// This class implements the interface
}
}
}
catch (BadImageFormatException)
{
// Not a .net assembly - ignore
}
}
}
public static bool InterfaceFilter(Type typeObj, Object criteriaObj)
{
return typeObj.ToString() == criteriaObj.ToString();
}
Vous pouvez définir une liste d'interfaces si vous voulez correspondre à plus d'un.
En termes de "minimum" de code, ce qui peut être réduit, par exemple par l'utilisation de LINQ dans l' foreach
. Gardez à l'esprit que "minimal" ne signifie pas nécessairement efficace, ou facilement de débogage, ou facilement comprise par quelqu'un d'autre...