using System.Reflection;
using Dpz.Core.EnumLibrary;

namespace Dpz.Core.Public.ViewModel;

/// <summary>
/// Represents the VmUserInfo type.
/// </summary>
public class VmUserInfo
{
    /// <summary>
    /// 账号
    /// </summary>
    public required string Id { get; set; }

    /// <summary>
    /// 昵称
    /// </summary>
    public required string Name { get; set; }

    /// <summary>
    /// 最后访问时间
    /// </summary>
    public DateTime? LastAccessTime { get; set; } = DateTime.Now;

    /// <summary>
    /// 个性签名
    /// </summary>
    public string? Sign { get; set; }

    /// <summary>
    /// 邮箱
    /// </summary>
    public string? Email { get; set; }

    /// <summary>
    /// 头像
    /// </summary>
    public required string Avatar { get; set; }

    /// <summary>
    /// 性别
    /// </summary>
    public Sex Sex { get; set; }

    /// <summary>
    /// 权限
    /// </summary>
    public Permissions? Permissions { get; set; }

    /// <summary>
    /// 是否启用
    /// </summary>
    public bool? Enable { get; set; }

    /// <summary>
    /// 唯一 key
    /// 当密码修改时,这个key将会改变
    /// </summary>
    public required string Key { get; set; }

    /// <summary>
    /// 当前登录会话 ID
    /// </summary>
    public string? SessionId { get; set; }

    /// <summary>
    /// 邮箱是否已验证
    /// </summary>
    public bool EmailVerified { get; set; } = false;

    private static readonly Lazy<Dictionary<string, PropertyInfo>> PropertyCache = new(() =>
    {
        var type = typeof(VmUserInfo);
        return type.GetProperties().ToDictionary(x => x.Name, x => x);
    });

    /// <summary>
    /// Executes GetCanWriteProperties.
    /// </summary>
    public static Dictionary<string, PropertyInfo> GetCanWriteProperties()
    {
        return PropertyCache
            .Value.Where(x => x.Value.CanWrite)
            .ToDictionary(x => x.Key, x => x.Value);
    }

    /// <summary>
    /// Executes Empty.
    /// </summary>
    public static VmUserInfo Empty() =>
        new()
        {
            Id = "",
            Name = "",
            LastAccessTime = DateTime.Now,
            Sign = "",
            Email = "",
            Avatar = "",
            Sex = Sex.Other,
            Permissions = null,
            Enable = true,
            Key = "",
            SessionId = null,
        };
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个C#的视图模型(ViewModel)类,用于表示用户信息。以下是详细解释:

类的整体结构

public class VmUserInfo
  • 命名空间:Dpz.Core.Public.ViewModel
  • 这是一个用户信息的数据传输对象(DTO),通常用于在应用层之间传递用户数据

属性说明

必填属性(required)

  • Id: 用户账号(必填字段)
  • Name: 用户昵称(必填字段)
  • Avatar: 用户头像(必填字段)
  • Key: 唯一密钥,密码修改时会改变(安全机制,必填字段)

可选属性

  • LastAccessTime: 最后访问时间,默认为当前时间
  • Sign: 个性签名
  • Email: 邮箱地址
  • Sex: 性别(枚举类型)
  • Permissions: 权限信息(可能是权限枚举或对象)
  • Enable: 是否启用账号
  • SessionId: 当前登录会话ID
  • EmailVerified: 邮箱是否已验证,默认为false

核心功能

1. 属性缓存机制

private static readonly Lazy<Dictionary<string, PropertyInfo>> PropertyCache
  • 使用 Lazy<T> 实现懒加载,只在首次使用时初始化
  • 通过反射获取类的所有属性信息
  • 将属性信息缓存在字典中(键为属性名,值为PropertyInfo对象)
  • 性能优化:避免重复反射操作

2. 获取可写属性

public static Dictionary<string, PropertyInfo> GetCanWriteProperties()
  • 筛选出所有可写(CanWrite)的属性
  • 返回属性名和属性信息的字典
  • 用途:动态赋值、数据映射等场景

3. 空对象模式

public static VmUserInfo Empty()
  • 创建一个默认的空用户对象
  • 所有必填字段都被初始化为空字符串或默认值
  • 遵循空对象模式,避免null引用异常

设计亮点

  1. 使用 required 关键字(C# 11特性):编译时强制初始化必填属性
  2. Lazy初始化:延迟加载,提高性能
  3. 反射缓存:避免重复反射开销
  4. 空对象模式:提供安全的默认实例
  5. 清晰的注释:每个属性都有中文说明

典型使用场景

  • 用户登录后的信息存储
  • API返回的用户数据
  • 前后端数据交互
  • 会话管理(通过SessionId和Key)
  • 权限验证(通过Permissions)
评论加载中...