c# - 从另一个 .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 文件中,但缺点是每当我想打开/显示不同的表单时都必须传递它们。
解决方案
在你的问题中有两件事要寻找:
您可以在其中UserSession
添加显式public
或private
和构造函数 - 一种用于“构造”类实例的特殊方法。
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);
其中id、user和displayName是其他变量或常量。
效果与调用后手动分配属性相同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;
}
这不是推荐的选项,但为了完整起见,我将其包括在内。
推荐阅读
- python - import nltk 在 Python 中不工作(nltk 和 numpy 已成功安装,pip 工作)
- angular - 如果“highcharts-chart”是一个 Angular 组件,那么验证它是这个模块的一部分
- javascript - 无法将特定索引处的新项目插入到数组中
- bash - Pentaho 日志文件未显示相关信息
- typescript - 将 DynamoDB 中的结束日期参数设为可选?
- gpu - 光栅化器如何每秒进行如此多的计算,但着色器甚至无法接近?
- java - Java Spring Security:将用户数据与用户详细信息分开是一种好习惯吗?
- reactjs - Typescript React 输入 onchange 不安全分配'任何'
- swift - 当我删除 DispatchQueue.main.async 我没有收到错误
- html - 如何使输入中的文本从顶部开始?