Я пытаюсь динамически зарегистрировать сервисы в startup.cs. У меня проблемы с вызовом метода из динамически типизированного объекта.
Шаги
- Создать интерфейс с методом;
public interface ICustBillTypeService
{ public static void RegisterTypeServices(IServiceCollection services) { } }
Создать класс из интерфейса. Метод принимает
ServiceCollection
и добавляет соответствующий
ServiceDescriptor
.
public class RPT628Registration : ICustBillTypeService
{
public static void RegisterTypeServices(IServiceCollection services)
{ services.AddScoped<RPT628Service>();}
}
Идентифицирует все классы в сборке, которые реализуют
ICustBillTypeService
и возвращают имя класса.
var results = Assembly.GetExecutingAssembly()
.GetTypes()
.Where(x => typeof(ICustBillEntityService).IsAssignableFrom(x)
&& !x.IsInterface
&& !x.IsAbstract)
.Select(x => x.Name).ToList();
Для каждого найденного класса вызовите метод интерфейса, реализованный этим классом, чтобы добавить службу в коллекцию ServiceCollection.
Здесь я сталкиваюсь с проблемами. Шаг 3 возвращает имя всех типов, которые реализуют интерфейс. Я могу просмотреть каждый результат, определить тип и создать экземпляр типа, но не могу добраться до метода класса, потому что мой объект динамически типизируется во время выполнения и имеет доступ только к определению базового объекта foreach(var result in results)
{
Type resultType = Type.GetType(result);
var t = Activator.CreateInstance(resultType);
--> t.RegisterTypeServices(services); //fails the build because the method is not part of the object until run time.
}
Я бы предпочел не называть "строковое" имя метода. В любом случае можно ли использовать интерфейс с «т», чтобы я мог вызвать имя метода?