C#中如何将一个类的对象实例传递给另一个类?
C# 跨类传递WinForm实例的常用优化方案
以下是几种比零散定义静态属性更易维护、耦合度更低的实现方案:
构造函数传参
这是最直接的强类型传递方式,在创建第二个类的实例时,直接把UI实例通过构造函数传入即可,不需要维护全局静态属性:
// 你的UI窗体类 public partial class MainForm : Form { // 初始化业务类时直接传入自身实例 private void InitBizClass() { var bizService = new BizService(this); bizService.HideMainForm(); } } // 需要访问UI的业务类 public class BizService { private readonly MainForm _mainForm; // 构造函数接收UI实例,存在私有字段中复用 public BizService(MainForm mainForm) { _mainForm = mainForm; } public void HideMainForm() { // 跨线程操作UI需加Invoke判断 if (_mainForm.InvokeRequired) { _mainForm.Invoke(new Action(() => _mainForm.Hide())); return; } _mainForm.Hide(); } }
该方案类型安全,依赖关系明确,不会出现静态变量意外释放、多实例冲突的问题。
属性/方法注入
如果第二个类的实例已经提前创建,无法在构造时传参,可以给第二个类加公开的UI实例属性,创建完成后手动赋值:
public class BizService { public MainForm MainFormIns { get; set; } public void HideMainForm() { MainFormIns?.Hide(); } } // 调用侧赋值 var bizService = new BizService(); bizService.MainFormIns = this; // 在UI类中给业务类属性赋值
事件通知模式
如果要降低业务类和UI类的耦合度,可以用事件实现:UI类订阅业务类的通知事件,收到事件后自行执行隐藏操作,业务类完全不需要感知UI类的存在:
// 业务类定义事件 public class BizService { public event Action HideMainFormRequested; public void SomeBizLogic() { // 执行到需要隐藏UI的逻辑节点时触发事件 HideMainFormRequested?.Invoke(); } } // UI类订阅事件 public partial class MainForm : Form { private readonly BizService _bizService = new BizService(); public MainForm() { InitializeComponent(); // 订阅事件,收到通知后执行隐藏逻辑 _bizService.HideMainFormRequested += () => this.Hide(); } }
该方案耦合度最低,符合单一职责原则,后续修改UI逻辑不需要改动业务类代码。
注意:如果涉及子线程操作UI控件,一定要加
Invoke判断再执行操作,否则会抛出线程安全异常。如果你的UI实例全局唯一,也可以用单例模式统一管理实例,比零散定义静态属性的可维护性更高。
内容的提问来源于stack exchange,提问作者user8630414
相关产品推荐
相关产品推荐

