gpt4 book ai didi

c# - 使用 ActivatorUtilities.CreateInstance 从类型创建实例

转载 作者:行者123 更新时间:2023-11-30 20:15:44 26 4
gpt4 key购买 nike

我正在尝试使用内置的 .Net 依赖注入(inject)在 .Net Core 中重写一些代码。以前,我使用当前代码创建实例(它使用 Unity 进行 DI),效果很好。

var instance = (IPipe)UnityHelper.Container.Resolve(implementation);

对于 .Net Core,我首先尝试了标准的 Activator.CreateInstance,它运行良好并创建了我期望的 IPipe 实例。

var instance = (IPipe)Activator.CreateInstance(implementation)

但是。那么问题是,如果实现在 ctor 中注入(inject)服务,那么它们将不会被解析(这就是为什么我在之前的项目中使用 Unity.Resolve 来解决这个问题)。

经过一些研究,我发现了 ActivatorUtilities 类,并将其替换为下面的代码(serviceProvider 是 IServiceProvider)

var instance = ActivatorUtilities.CreateInstance<IPipe>(serviceProvider, implementation);

但是,我现在收到当前错误。

A suitable constructor for type 'IPipe' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.

我不明白为什么 Activator.CreateInstance 工作正常,但这是在提示 IPipe 构造函数?

最佳答案

通用 ActivatorUtilities.CreateInstance<T>(IServiceProvider, Object[]) 实际上会创建一个 T 类型的实例并尝试使用服务提供者解析类型的构造函数参数。您可以传递的对象数组用于服务提供商未提供的其他构造函数参数。

如果您只想创建一个运行时类型的实例并让 DI 容器注入(inject)依赖项,那么您将需要使用非泛型 ActivatorUtilities.CreateInstance(IServiceProvider, Type, Object[]) .

该方法返回 object ,所以如果你想使用它,你必须对它进行类型转换。例如:

var instance = (IPipe)ActivatorUtilities.CreateInstance(serviceProvider, pipeType);

关于c# - 使用 ActivatorUtilities.CreateInstance 从类型创建实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52644507/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com