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

如何在Visual Studio用户控件中访问Program.cs中声明的对象?

解决方案

方案1:通过事件通知传递对象引用(最可靠)

这种方式能确保控件在对象初始化完成后才拿到引用,避免空引用问题,且不需要修改原有对象的非static属性。

步骤1:在Program.cs中定义事件并触发

// 在Program类中添加静态事件,用于通知对象初始化完成
public static event Action<Engine, GearBox, Chassis> ObjectsInitialized;

// 初始化三个对象的代码位置
OBJ_CurrentEngine = new Engine();
OBJ_CurrentGearBox = new GearBox();
OBJ_CurrentChassis = new Chassis();

// 触发事件,将初始化后的对象传递出去
ObjectsInitialized?.Invoke(OBJ_CurrentEngine, OBJ_CurrentGearBox, OBJ_CurrentChassis);

步骤2:在General_Inputs控件中订阅事件

private Engine _currentEngine;
private GearBox _currentGearBox;
private Chassis _currentChassis;

public General_Inputs()
{
    InitializeComponent();
    // 订阅Program中的初始化完成事件
    Engine_Simulator.Program.ObjectsInitialized += OnObjectsInitialized;
}

// 事件回调,接收初始化后的对象
private void OnObjectsInitialized(Engine engine, GearBox gearBox, Chassis chassis)
{
    _currentEngine = engine;
    _currentGearBox = gearBox;
    _currentChassis = chassis;
    
    // 这里可以执行需要使用这些对象的逻辑,比如绑定数据、初始化控件状态等
}

// 控件销毁时取消订阅,防止内存泄漏
protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        Engine_Simulator.Program.ObjectsInitialized -= OnObjectsInitialized;
        components?.Dispose();
    }
    base.Dispose(disposing);
}

方案2:添加静态属性指向原有对象(最简单)

这种方式不需要修改原有对象的访问修饰符,仅新增静态属性对外提供访问,不会破坏现有代码逻辑。

步骤1:在Program.cs中添加静态属性

// 新增静态属性,指向已初始化的非static对象
public static Engine CurrentEngine { get; private set; }
public static GearBox CurrentGearBox { get; private set; }
public static Chassis CurrentChassis { get; private set; }

// 初始化对象时同步赋值给静态属性
OBJ_CurrentEngine = CurrentEngine = new Engine();
OBJ_CurrentGearBox = CurrentGearBox = new GearBox();
OBJ_CurrentChassis = CurrentChassis = new Chassis();

步骤2:在General_Inputs控件中访问

注意要判断对象是否已初始化,避免空引用:

private void General_Inputs_Load(object sender, EventArgs e)
{
    // 检查对象是否已初始化
    if (Engine_Simulator.Program.CurrentEngine != null)
    {
        // 直接使用对象,比如:
        var enginePower = Engine_Simulator.Program.CurrentEngine.Power;
    }
    
    // 如果对象可能延迟初始化,也可以使用定时器轮询,或者结合方案1的事件确保安全
}

方案3:依赖注入(适合复杂项目解耦)

如果项目规模较大,希望降低耦合度,可以使用依赖注入(DI)来传递对象实例。

步骤1:在Program.cs中配置DI容器

using Microsoft.Extensions.DependencyInjection;

// 构建服务容器
var services = new ServiceCollection();
// 将初始化后的对象注册为单例服务
services.AddSingleton(OBJ_CurrentEngine);
services.AddSingleton(OBJ_CurrentGearBox);
services.AddSingleton(OBJ_CurrentChassis);
// 注册用户控件(需要修改控件构造函数)
services.AddTransient<General_Inputs>();

var serviceProvider = services.BuildServiceProvider();

// 从容器中获取控件实例,而非直接new
var generalInputs = serviceProvider.GetRequiredService<General_Inputs>();
// 将控件添加到窗体等容器中

步骤2:修改General_Inputs的构造函数接收依赖

private readonly Engine _currentEngine;
private readonly GearBox _currentGearBox;
private readonly Chassis _currentChassis;

// 通过构造函数注入对象实例
public General_Inputs(Engine engine, GearBox gearBox, Chassis chassis)
{
    InitializeComponent();
    _currentEngine = engine;
    _currentGearBox = gearBox;
    _currentChassis = chassis;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 05:07:30