C# Service Collection добавляет тип как объект, а не его фактический тип
У меня небольшая проблема с моим кодом.
По сути, я пытаюсь динамически добавлять классы, созданные мной в результате десериализации JSON, в мою коллекцию ServiceCollection, чтобы я мог получить их из любого класса, который в них нуждается. Пока у меня есть следующий код:
Assembly.GetExecutingAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(AbstractConfiguration)) && !t.IsAbstract).ToList().ForEach(x => {
if (!File.Exists(x.Name + ".json")) {
object Configuration = Activator.CreateInstance(x);
File.WriteAllText(x.Name + ".json", JsonSerializer.Serialize(Configuration, new JsonSerializerOptions() { WriteIndented = true }));
ServiceCollection.AddSingleton(Configuration);
} else {
string json = File.ReadAllText(x.Name + ".json");
object Configuration = JsonSerializer.Deserialize(json, x, new JsonSerializerOptions() { WriteIndented = true });
ServiceCollection.AddSingleton(Configuration);
}
});
Мы загружаем наш JSON в класс (который работает), однако добавляем его в нашу коллекцию (что работает); при добавлении в нашу коллекцию типом является объект, поэтому, когда я пытаюсь вызвать его черезServices.GetServices(typeof(BotConfiguration)).ToList().Count);
, он возвращает 0. Что дает?
Что ж, если мы вместо этого попробуем бежать Services.GetServices(typeof(object)).ToList().ForEach(x => Console.WriteLine(x.ToString()));
, мы действительно можем видеть, что этот экземпляр фактически подпадает под тип объекта, хотя когда мы запускаем x.ToString(), он показывает, что это экземпляр BotConfiguration (в моем случае выводит Dexter.Core.Configurations.BotConfiguration).
Как бы мы могли заставить нашу ServiceCollection добавить это как фактический класс, а не как объект? Он четко знает, что это за тип...?
1 ответ
Ваш код вызывает общую версию метода (AddSingleton<TService>(IServiceCollection, TService)
) с параметром универсального типа, разрешенным во время компиляции в object
, попробуйте позвонить одному из принимающих Type
параметр (см. все перегрузки) следующим образом:
ServiceCollection.AddSingleton(x);
UPD
Есть перегрузка (AddSingleton(IServiceCollection, Type, Object)
) принимающий тип и экземпляр объекта:
ServiceCollection.AddSingleton(x, Configuration);