1

我的代码有点问题。

基本上,我正在尝试将通过反序列化 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。什么给出了?

好吧,如果我们改为尝试 run Services.GetServices(typeof(object)).ToList().ForEach(x => Console.WriteLine(x.ToString()));,我们实际上可以看到这个实例化实际上属于对象类型,即使当我们运行 x.ToString() 时,它表明它是 BotConfiguration 的一个实例(输出 Dexter.Core.Configurations. BotConfiguration 在我的例子中)。

我们如何让我们的 ServiceCollection 将其添加为它的实际类而不是对象?它清楚地知道它是什么类型……?

4

1 回答 1

0

您的代码正在调用泛型版本的方法 ( AddSingleton<TService>(IServiceCollection, TService)),泛型类型参数在编译时被解析为object,尝试调用一个接受Type参数(查看所有重载),如下所示:

ServiceCollection.AddSingleton(x);

UPD

有重载(AddSingleton(IServiceCollection, Type, Object))接受类型和对象实例:

ServiceCollection.AddSingleton(x, Configuration);
于 2020-08-24T00:55:07.523 回答