如何在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
相关产品推荐
相关产品推荐

