Как хранить и использовать список реализаций интерфейса в C#?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как хранить и использовать список реализаций интерфейса в C#?

Сообщение Anonymous »

Я хотел бы создать быстрый способ регистрации заданий HangFire. Все они реализуют интерфейс IJob (который содержит Task Run()). Проблема в том, что я не могу заставить список принять модели, созданные таким образом. Пример:
Пример вакансии:

Код: Выделить всё

public class CheckFilesJob() : IJob
{
async Task Run()
{
// do something here
}
Модель, которую я хочу использовать при регистрации:

Код: Выделить всё

public class JobConfiguration
where T : IJob
{
public JobConfiguration(string key, string queueName, Expression jobExpression, string cronExpression)
{
Key = key;
QueueName = queueName;
JobExpression = jobExpression;
CronExpression = cronExpression;
}

public string Key { get; set; }

public string QueueName { get; set; }

public Expression JobExpression { get; set; }

public string CronExpression { get; set; }
}
Как я хочу создать экземпляр списка:

Код: Выделить всё

new List
{
new JobConfiguration("Check Files",
jobsConfiguration.Value.QueueName,
x => x.Run(),
jobsConfiguration.Value.CheckFilesSchedule),
new JobConfiguration("Another Job", jobsConfiguration.Value.QueueName, x => x.Run(), jobsConfiguration.Value.AnotherJobSchedule)
};
И как я хочу это использовать:

Код: Выделить всё

    public static void HandleJobRegistration(
this IServiceProvider serviceProvider,
IEnumerable configurations)
{
// register each job here
}
Проблемы:

[*]Не могу создать список IJob, поскольку реализацию невозможно преобразовать в интерфейс (CS1503 ).
[*]Кажется, я не могу пропустить установку IJobConfiguration как универсального, иначе jobExpression, передаваемое в модель, принадлежит интерфейсу (а не реализации).
[*]Я не могу использовать () => new CheckFilesJob().Run(), потому что это будет выглядеть некрасиво, учитывая, сколько сервисов необходимо предоставить для задания.

Пытался работать как с универсальным, так и с неуниверсальным классом, надеясь каким-то образом обеспечить правильное выражение. Пробовал разные способы предоставления списка в качестве аргумента функции, но безрезультатно.

Подробнее здесь: https://stackoverflow.com/questions/786 ... tions-in-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»