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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:57:01