Необходимо обработать все типы в сборке и найти типы, которые ее реализуют.
Вы можете использовать что-то подобное (написанное от руки прямо сейчас, оно может содержать ошибки).
foreach (Type type in Assembly.GetAssembly(typeof(BaseReport)).GetTypes())
{
if (type != typeof(BaseReport) && typeof(BaseReport).IsAssignableFrom(type))
{
// we found a type, we can store it somewhere, for example, in a list and our list in a static readonly field for fast lookup in the future.
myreports.Add(type);
}
}
Вы также можете обрабатывать все загруженные сборки.
Это, однако, не лучший способ сделать это, сложный, довольно неясный и довольно трудный для понимания.
Я бы использовал простой фабричный класс, который даст вам экземпляр вашего отчета в соответствии с запросом, когда вы добавляете отчет, добавляете его с помощью простого вызова .Add.