首页 > 解决方案 > 从另一个 .cs 文件访问 C# 类的问题

问题描述

我正在创建一个登录表单,当身份验证成功完成时,会在以下类中插入 3 个参数(userID、user 和 displayName):

用户会话.cs

namespace Summaries
{
    /// <summary>
    /// Stores the user information sent by the server
    /// </summary>
    class UserSession
    {
        public int userID { get; set; }
        public string user { get; set; }
        public string displayName { get; set; }
    }
}

当我在登录表单上时,我可以从类中写入/读取,但是当我尝试读取我的 main.cs 文件时,它返回 null。

主文件

private void main_Shown(object sender, EventArgs e)
{
    UserSession session = new UserSession();
    sessionLabel.Text += session.displayName;
}

这可能只是一个新手错误,但你能告诉我如何访问这些值,或者,如果这种方法不理想/可能,一种在表单之间存储和访问值的方法?

编辑:我已经尝试过不同的方法来“初始化”它。我也试过UserSession session;但得到了“使用未分配的局部变量'会话'”

我的解决方法:我决定在调用时将信息传递给另一个表单,而不是使用另一个文件中的类来尝试存储用户信息:

登录.cs

private void loginBTN_Click(object sender, EventArgs e)
{
        serverResponse response;
        userSession session;

        string username = usernameBox.Text;
        string password = passwordBox.Text;
        string jsonResponse = LoginValidation(username, password);
        response = JsonConvert.DeserializeObject<serverResponse>(jsonResponse);

        if (response.status)
        {
            session = JsonConvert.DeserializeObject<userSession>(jsonResponse);
            main mainForm = new main(session.userID, session.user, session.displayName);
            this.Hide();
            mainForm.Show();
        }
        else
        {
            ...
        }
}

    private class userSession
    {
          public int userID { get; set; }
          public string user { get; set; }
          public string displayName { get; set; }
    }

    private class serverResponse
    {
           public bool status { get; set; }
           public string errors { get; set; }
    }

主文件

private int userID;
private string user;
private string displayName;

/// <summary>
/// Main function from  the dashboard form.
/// </summary>
/// <param name="id">The user id retrived from the database</param>
/// <param name="username">The username retrived from the database (login name)</param>
/// <param name="display">The name to be displayed that was retrived from the database</param>
public main(int id, string username, string display)
{
    InitializeComponent();
    userID = id;
    user = username;
    displayName = display;
}

使用这种方法,我可以将值获取到我的 main.cs 文件中,但缺点是每当我想打开/显示不同的表单时都必须传递它们。

标签: c#forms

解决方案


在你的问题中有两件事要寻找:

您可以在其中UserSession添加显式publicprivate和构造函数 - 一种用于“构造”类实例的特殊方法。

public class UserSession
{
    public int UserID { get; set; }
    public string User { get; set; }
    public string DisplayName { get; set; }

    public UserSession(int id, string user, string displayName) 
    {
         UserID = id;
         User = user;
         DisplayName = displayName;
    }
}

显式指定private(默认)或public有利于可维护性,是 C# 中的一种标准。

当你想要UserSession对象时,像这样调用它:

var user = new UserSession(id, user, displayName);

其中iduserdisplayName是其他变量或常量。

效果与调用后手动分配属性相同new UserSession()(不带任何参数),但在大多数情况下,使用构造函数被认为是更好的做法。

但是,在您的情况下

private void main_Shown(object sender, EventArgs e)
{
    UserSession session = new UserSession(**id**, **name**, **displayName**);
    sessionLabel.Text += session.displayName;
}

您需要将那些添加到构造函数的变量或常量提供给该方法。如果您的应用程序是 WebForms,那么您应该在某个地方拥有它,并且需要在EventArgs. 如果您在桌面环境中,您也可以这样做。

但是,在桌面环境中,您有另一个可行的选项,只要您只有一个用户,它就可以正常工作。您可以在拥有上述方法的类中创建字段。并随时分配UserSession对象的字段。

您还可以(在一个用户场景中)创建UserSession一个具有公共属性且没有构造函数的静态类,然后在获得有关用户的数据后立即再次分配给该类的属性。您不必创建任何实例,也不必归档,因为静态字段可以通过它们的类名访问(并且在程序范围内只有一个此类的实例,因此只有一个用户)。

.... before ....
UserSession.DisplayName = "user";
... then ...
private void main_Shown(object sender, EventArgs e)
{
    sessionLabel.Text += UserSession.DisplayName;    
}

这不是推荐的选项,但为了完整起见,我将其包括在内。


推荐阅读