В своем коде я создал систему плагинов, которая загружает типы из DLLS. Я беру нужный мне тип из загруженной DLL, используя этот код;
var type = Assembly.LoadFrom(filePath).GetTypes()
.FirstOrDefault(t =>
t.IsClass && t.IsSubclassOfRawGeneric(typeof(DespatchBasePlugin<>)));
IsSubClassOfRawGeneric находит базовый тип, так как он скрыт несколькими классами, код работает и возвращается правильный тип.
Затем я создаю экземпляр этого класса с помощью Activator;
DespatchBasePlugin<XMLSettingBase> obj = Activator.CreateInstance(type, new object[] { logger }) as DespatchBasePlugin<XMLSettingBase>;
К сожалению, приведение в этой строке создает нулевую ссылку. Удаление приведения возвращает экземпляр рассматриваемого класса, но мне нужно сохранить его как базовый тип.
Это загружаемый класс (сокращенно для краткости);
public class DHLPlugin : DespatchBasePlugin<UserSetting>
{
public DHLPlugin(BaseForm logger) : base("DHL", logger)
{
this.order = 10;
}
}
И это базовый класс, который я хочу использовать (обратите внимание, что сам класс имеет базовый класс, он идет на несколько уровней в глубину);
public abstract class DespatchBasePlugin<TSettings> : DespatchBase<TSettings> where TSettings : XMLSettingBase, new()
Предыдущий код использовал базовый класс без назначенного ему универсального и работал абсолютно нормально. Это выглядело так;
DespatchBasePlugin obj = Activator.CreateInstance(type, new object[] { logger }) as DespatchBasePlugin;
Я уверен, что делаю что-то глупое, пожалуйста, скажите мне, что это такое.
Изменить. Не помечен как дубликат, так как я считаю, что это лучший вопрос/ответ, чем другой, который состоит из общей ссылки на MSDN в качестве ответа. Если это неправильный способ использования системы дублирования, сообщите мне об этом.
DespatchBasePlugin<>
? - person Llama   schedule 02.02.2018IPlugin
, который должен реализовать каждый класс. Идя таким путем, у вас не будет проблем, которые вы описываете, потому что вам не нужно что-то разыгрывать. - person user743414   schedule 02.02.2018