如何从另一个类的对象中获取数据?C#类间数据访问问题
问题分析与解决方案
你的代码存在几个关键问题,导致无法访问到填充好的User数据:
- 局部变量作用域错误:Firstclass的
OnLogin方法里,user是局部变量,还错误地添加了public修饰符(局部变量不能用访问修饰符)。这个变量只在OnLogin方法内部有效,类外部根本无法访问。 - 实例不共享:Class B里新建了一个
Firstclass实例,这个新实例的user从未被初始化赋值,和你之前填充数据的Firstclass实例完全是两个对象。 - 语法错误:字符串
abc@abc.com未加引号、赋值语句末尾缺少分号,这些都会导致代码编译失败。
修正方案一:类成员变量+实例传递
步骤1:修正Firstclass,将user改为类的公共成员
public class Firstclass { // 定义为类的公共成员变量,外部可访问 public User User { get; set; } public void OnLogin() { User = new User(); User.email = "abc@abc.com"; // 字符串必须加引号,补充分号 User.password = "123456"; User.mobilenumber = "13800138000"; User.service = "Basic"; } }
步骤2:Class B接收已初始化的Firstclass实例
不要在Class B里新建Firstclass,而是通过构造函数传入已经执行过OnLogin的实例:
public class B : ComponentBase // 假设是Blazor组件,继承ComponentBase { private readonly Firstclass _firstClass; // 通过构造函数注入已初始化的Firstclass实例 public B(Firstclass firstClass) { _firstClass = firstClass; } protected override async Task OnInitializedAsync() { if (_firstClass.User != null) { string output = _firstClass.User.email; // 这里可以将output绑定到UI展示,比如赋值给组件属性 } } }
步骤3:创建实例并传递
在入口处先初始化Firstclass并执行登录逻辑,再传给B:
// 示例:在程序启动或页面跳转时 var firstClass = new Firstclass(); firstClass.OnLogin(); var bComponent = new B(firstClass);
修正方案二:全局状态管理(适合Blazor等组件化场景)
如果是Blazor应用,更推荐用全局状态容器共享User数据,避免实例传递的麻烦:
步骤1:创建全局状态类
public class AppState { // 存储当前登录用户 public User CurrentUser { get; set; } }
步骤2:注册为单例服务
在Program.cs里将AppState注册为单例,确保整个应用只有一个实例:
builder.Services.AddSingleton<AppState>();
步骤3:Firstclass中更新全局状态
通过依赖注入获取AppState,在登录时填充用户数据:
public class Firstclass { private readonly AppState _appState; // 依赖注入AppState public Firstclass(AppState appState) { _appState = appState; } public void OnLogin() { _appState.CurrentUser = new User(); _appState.CurrentUser.email = "abc@abc.com"; // 其他属性赋值 } }
步骤4:Class B中读取全局状态
同样通过依赖注入获取AppState,直接读取用户数据:
public class B : ComponentBase { // 注入全局状态 [Inject] private AppState _appState { get; set; } protected override async Task OnInitializedAsync() { if (_appState.CurrentUser != null) { string output = _appState.CurrentUser.email; // 绑定到UI展示 } } }
内容的提问来源于stack exchange,提问作者obind
相关产品推荐
相关产品推荐

