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

如何从另一个类的对象中获取数据?C#类间数据访问问题

问题分析与解决方案

你的代码存在几个关键问题,导致无法访问到填充好的User数据:

  1. 局部变量作用域错误:Firstclass的OnLogin方法里,user是局部变量,还错误地添加了public修饰符(局部变量不能用访问修饰符)。这个变量只在OnLogin方法内部有效,类外部根本无法访问。
  2. 实例不共享:Class B里新建了一个Firstclass实例,这个新实例的user从未被初始化赋值,和你之前填充数据的Firstclass实例完全是两个对象。
  3. 语法错误:字符串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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 12:40:42