Почему я не могу использовать переменную для typeof в Quartz.NET?
Я пытаюсь создать работу в форме ASP.NET (C#) с помощью Quartz.NET, и вот что у меня есть до сих пор:
JobDetail jobDetail = new JobDetail(count + "_job", schedID, typeof(HTTPtoFTP));
Проблема в том, что я не хочу напрямую ссылаться на класс HTTPtoFTP, потому что в зависимости от того, что пользователь выберет в форме, он будет ссылаться на отдельный класс. Я попытался использовать переменную вместо HTTPtoFTP, но я получаю ошибку:
Тип или пространство имен 'mergedJobType' не может быть найдено (вам не хватает директивы using или ссылки на сборку?)
Почему это? Я думаю, что один из способов сделать это - оператор IF, где я просто копирую строку и меняю typeof для каждой возможности, но мне кажется, что мне придется повторить все остальные строки, которые также ссылаются на jobDetail.
5 ответов
Если я что-то упустил, я думаю, что вы ищете mergedJobType.GetType()
Это возвращает объект типа класса объекта.
В.NET есть два наиболее распространенных способа получения типа.
Когда тип известен во время компиляции, используйте typeof
,
Если тип известен только во время выполнения и у вас есть ссылка на объект этого типа, вызовите его GetType()
чтобы получить объект типа.
Обратите внимание, что для универсальных типов есть разница между, скажем, typeof(List<int>)
а также typeof(List<>)
поэтому, если вы интенсивно используете рефлексию, вы можете узнать, как работать с общими типами времени выполнения.
Потому что это именно то, что typeof
делает, он принимает метку для типа и возвращает соответствующий Type
объект.
Что бы вы хотели mergedJobType.GetType()
, GetType()
возвращает тип экземпляра
Все комментарии пока верны. Я только что прошел через это сам. Следующая строка должна делать то, что вам нужно, если mergedJobType является экземпляром класса, который реализует IJob:
JobDetail jobDetail = new JobDetail(count + "_job", schedID, mergedJobType.GetType());
Вы получаете сообщение об ошибке "Класс Job должен реализовывать интерфейс Job".:(Type mergedJobType2 = mergedJobType.GetType(); JobDetail jobDetail = new JobDetail(count + "_job", schedID, mergedJobType2);
более чем вероятно из-за того, что mergedJobType не реализует интерфейс IJob. Все задания Quartz.Net должны реализовывать интерфейс IJob.
Вы можете получить тип переменной, используя mergedJobType.GetType()
,