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

C#新手求教:如何在另一窗体中调用Info类的GetCardName方法

问题原因

你当前的写法是把GetCardName()当做类的静态方法直接调用,但你Info类中定义的CardName属性、GetCardName()、SetName()都是实例成员,必须先实例化Info类得到对象后,才能通过对象调用这些成员,直接用类名调用会报错。

推荐两种适合新手的解决方案

方案1:修改为静态成员(适合全局存储用户信息的场景)

这种方案不需要修改你Form2里的调用逻辑,只要修改Info.cs的代码,把相关成员改为静态即可:

// 存储姓名的属性改为静态
private static string CardName { get; set; } = "";
   
// 获取姓名方法改为静态
public static string GetCardName()
{
    return CardName;
}

// 赋值姓名方法改为静态
public static void SetName(string name = "")
{
    CardName = name;
}

注意修改后,你在登录页保存姓名时,也要直接用类名调用SetName:Info.SetName(用户输入的姓名字符串),不要实例化Info对象。

方案2:实例传参(适合不想用静态成员的场景)

首先在登录窗体的登录逻辑中,实例化Info对象并赋值姓名,再把这个实例传递给Form2:

// 登录页登录按钮点击的逻辑示例
Info userInfo = new Info();
userInfo.SetName(输入框.Text);
// 构造Form2时传入实例
Form2 form2 = new Form2(userInfo);
form2.Show();

再修改Form2的代码,接收传递过来的Info实例:

// Form2类内新增私有字段存Info实例
private Info _userInfo;

// 修改Form2的构造函数
public Form2(Info userInfo)
{
    InitializeComponent();
    _userInfo = userInfo;
}

private void Form2_Load(object sender, EventArgs e)
{
    // 通过实例调用方法
    lblWelcome.Text = _userInfo.GetCardName();
}

补充小技巧

如果你的Info类仅用来存储用户信息,不需要额外的校验逻辑,可以不用单独写Set、Get方法,C#支持直接写公共自动属性,写法更简洁:

// 静态场景下直接这么写就行
public static string CardName { get; set; } = "";
// 用的时候直接赋值:Info.CardName = "张三"; 直接取值:lblWelcome.Text = Info.CardName;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:24:05