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

