По сути, перефразируя, вы хотите проверить, определяет ли класс контракт интерфейса, даже если он явно не реализует этот интерфейс?
Это очень нетривиальная и очень, очень плохая идея. Вместо этого я настоятельно рекомендую вам преобразовать интерфейс вашего плагина в контрактную сборку и ссылаться на сборку как из ваших плагинов, так и из основного приложения. Тогда ваши плагины могут фактически реализовать контракт, и вы получите защиту компилятора от путаницы в реализации.
Если вы настаиваете на том, чтобы идти по этому маршруту, однако:
var interfaceType = typeof(IArticleManager);
var targetType = typeof(SqlArticle);
foreach(var member in interfaceType.GetMembers())
{
var targetMember = targetType.GetMember(member.Name);
// compare the arguments, generic constraints, etc here
}
Я оставлю это вам, чтобы сделать сравнение, потому что это, честно говоря, значительное количество кода. Вам необходимо проверить, является ли элемент свойством, событием или методом, общим или неуниверсальным и т. Д.