You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity C#使用Zenject时如何向Activator创建的已有对象注入依赖

Zenject手动注入已创建实例的解决方案

解决步骤

  1. 先在你实现GetTask方法的类中,注入Zenject的核心容器DiContainer:
// 在GetTask所属类中添加注入字段
[Inject] private DiContainer _diContainer;
  1. 修改GetTask方法,在你通过Activator.CreateInstance创建实例后,调用容器的Inject方法完成手动依赖注入:
public Task GetTask(byte header)
{
    Log.WriteConsole($"== packet type={header}");
    PacketType packetType = _packetType.GetType().GetFields()
            .Select(field => (PacketType)field.GetValue(_packetType))
            .First(p => p.Header.Equals(header));
    Task taskInstance = (Task)Activator.CreateInstance(packetType.Type);
    // 手动注入已注册的依赖
    _diContainer.Inject(taskInstance);
    return taskInstance;
}

额外说明

  • 你提供的代码中LoginTask的SetPacket方法里用了小写的serializer,但父类声明的注入字段是大写开头的Serializer,需要修正变量名避免空引用。
  • 若你没有必须使用Activator.CreateInstance的强制要求,可以直接用DiContainer提供的实例化方法,一步完成创建+注入:
Task taskInstance = (Task)_diContainer.Instantiate(packetType.Type);
  • 请确认你已经在项目的Zenject Installer中正确注册了带Id标记的ISerializer实现,示例注册代码如下:
// 示例:在你的Installer类的InstallBindings方法中添加
Container.Bind<ISerializer>().WithId("Json").To<你自己的Json序列化实现类>().AsSingle();

内容的提问来源于stack exchange,提问作者Dennis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 08:36:07