C# 服务集合将类型添加为对象而不是其实际类型
C# Service Collection adds type as object rather than its actual type
我的代码有点问题。
基本上,我正在尝试将我通过反序列化 JSON 创建的 class 动态添加到我的 ServiceCollection 中,这样我就可以从任何需要的 class 中获取它们他们。到目前为止,我得到了以下代码:
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 加载到 class 中(有效),然后将其添加到我们的集合中(有效);当添加到我们的集合中时,类型是一个对象,所以当我尝试通过 Services.GetServices(typeof(BotConfiguration)).ToList().Count);
调用它时,它 returns 0。什么给了?
好吧,如果我们改为尝试 运行 Services.GetServices(typeof(object)).ToList().ForEach(x => Console.WriteLine(x.ToString()));
,我们实际上可以看到这个实例实际上属于 object 类型,即使当我们运行 x.ToString(),它表明它是 BotConfiguration 的一个实例(在我的例子中输出 Dexter.Core.Configurations.BotConfiguration)。
我们如何让我们的 ServiceCollection 将其添加为它的实际 class 而不是一个对象?明明知道是什么类型的...?
您的代码正在调用方法的泛型版本 (AddSingleton<TService>(IServiceCollection, TService)
),泛型类型参数在编译时被解析为 object
,请尝试调用一个接受 Type
参数(查看所有 overloads) 像这样:
ServiceCollection.AddSingleton(x);
UPD
有重载(AddSingleton(IServiceCollection, Type, Object)
)接受类型和对象实例:
ServiceCollection.AddSingleton(x, Configuration);
我的代码有点问题。
基本上,我正在尝试将我通过反序列化 JSON 创建的 class 动态添加到我的 ServiceCollection 中,这样我就可以从任何需要的 class 中获取它们他们。到目前为止,我得到了以下代码:
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 加载到 class 中(有效),然后将其添加到我们的集合中(有效);当添加到我们的集合中时,类型是一个对象,所以当我尝试通过 Services.GetServices(typeof(BotConfiguration)).ToList().Count);
调用它时,它 returns 0。什么给了?
好吧,如果我们改为尝试 运行 Services.GetServices(typeof(object)).ToList().ForEach(x => Console.WriteLine(x.ToString()));
,我们实际上可以看到这个实例实际上属于 object 类型,即使当我们运行 x.ToString(),它表明它是 BotConfiguration 的一个实例(在我的例子中输出 Dexter.Core.Configurations.BotConfiguration)。
我们如何让我们的 ServiceCollection 将其添加为它的实际 class 而不是一个对象?明明知道是什么类型的...?
您的代码正在调用方法的泛型版本 (AddSingleton<TService>(IServiceCollection, TService)
),泛型类型参数在编译时被解析为 object
,请尝试调用一个接受 Type
参数(查看所有 overloads) 像这样:
ServiceCollection.AddSingleton(x);
UPD
有重载(AddSingleton(IServiceCollection, Type, Object)
)接受类型和对象实例:
ServiceCollection.AddSingleton(x, Configuration);