using System.Text.Json.Serialization;
using Dpz.Core.Entity.Base;
namespace Dpz.Core.Public.Entity.Steam;
/// <summary>
/// 成就详情
/// </summary>
public class AchievementDetail
{
/// <summary>
/// 名称
/// </summary>
[JsonPropertyName("name")]
public string? Name { get; set; }
/// <summary>
/// 默认值
/// </summary>
[JsonPropertyName("defaultvalue")]
public int DefaultValue { get; set; }
/// <summary>
/// 显示名称
/// </summary>
[JsonPropertyName("displayName")]
public string? DisplayName { get; set; }
/// <summary>
/// 是否为隐藏成就
/// </summary>
[JsonPropertyName("hidden")]
[JsonConverter(typeof(BooleanConverter))]
public bool Hidden { get; set; }
/// <summary>
/// 描述
/// </summary>
[JsonPropertyName("description")]
public string? Description { get; set; }
/// <summary>
/// 已解锁成就图标
/// </summary>
[JsonPropertyName("icon")]
public string? Icon { get; set; }
/// <summary>
/// 未解锁成就图标
/// </summary>
[JsonPropertyName("icongray")]
public string? IconGray { get; set; }
/// <summary>
/// 成就解锁时间
/// </summary>
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime? UnlockTime { get; set; }
/// <summary>
/// 获取与另一个成就对象的差异
/// </summary>
/// <param name="other">要比较的成就对象</param>
/// <returns>差异信息字典</returns>
public Dictionary<string, string> GetChanges(AchievementDetail? other)
{
if (other == null)
{
return [];
}
var changes = new Dictionary<string, string>();
if (DefaultValue != other.DefaultValue)
{
changes.Add(nameof(DefaultValue), $"原值:{DefaultValue},新值:{other.DefaultValue}");
}
if (DisplayName != other.DisplayName)
{
changes.Add(nameof(DisplayName), $"原值:{DisplayName},新值:{other.DisplayName}");
}
if (Hidden != other.Hidden)
{
changes.Add(nameof(Hidden), $"原值:{Hidden},新值:{other.Hidden}");
}
if (Description != other.Description)
{
changes.Add(nameof(Description), $"原值:{Description},新值:{other.Description}");
}
if (Icon != other.Icon)
{
changes.Add(nameof(Icon), $"原值:{Icon},新值:{other.Icon}");
}
if (IconGray != other.IconGray)
{
changes.Add(nameof(IconGray), $"原值:{IconGray},新值:{other.IconGray}");
}
if (
UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss")
!= other.UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss")
)
{
changes.Add(
nameof(UnlockTime),
$"原值:{UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss") ?? "未解锁"},新值:{other.UnlockTime?.ToString("yyyy/MM/dd HH:mm:ss") ?? "未解锁"}"
);
}
return changes;
}
}
⚠⚠ 以下内容为AI分析的结果,请根据实际情况进行判断。
这是一个用于表示Steam游戏成就详情的C#实体类。让我详细解释一下这个代码的各个部分:
类的基本信息
public class AchievementDetail
这是一个公共类,用于封装Steam游戏成就的详细信息。
属性说明
JSON序列化属性
大部分属性都使用了[JsonPropertyName]特性,用于JSON序列化和反序列化时的属性名映射:
- Name: 成就的内部名称
- DefaultValue: 成就的默认值(通常为0或1)
- DisplayName: 成就的显示名称(用户看到的名称)
- Hidden: 是否为隐藏成就,使用了自定义的
BooleanConverter进行类型转换 - Description: 成就的描述文本
- Icon: 已解锁成就的图标URL
- IconGray: 未解锁成就的灰色图标URL
特殊属性
[BsonDateTimeOptions(Kind = DateTimeKind.Local)]
public DateTime? UnlockTime { get; set; }
UnlockTime属性使用了MongoDB的BSON序列化特性,指定日期时间为本地时间格式,用于记录成就解锁的时间。
核心方法:GetChanges
public Dictionary<string, string> GetChanges(AchievementDetail? other)
这是一个非常实用的方法,用于比较两个成就对象之间的差异:
功能特点:
- 空值处理: 如果传入的比较对象为null,直接返回空字典
- 逐属性比较: 比较所有重要属性的值变化
- 格式化输出: 将差异以"原值:xxx,新值:xxx"的格式记录
- 时间格式化: 对
UnlockTime进行特殊处理,格式化为"yyyy/MM/dd HH:mm:ss",未解锁时显示"未解锁"
应用场景:
- 成就数据更新时的变更追踪
- 游戏数据同步时的差异检测
- 用户成就进度的变化记录
- 数据审计和日志记录
设计优点
- JSON友好: 通过
JsonPropertyName特性实现与Steam API的无缝对接 - 数据库兼容: 支持MongoDB的BSON序列化
- 变更追踪: 内置的差异比较功能便于数据管理
- 类型安全: 使用强类型属性和可空类型确保数据安全
- 用户友好: 提供格式化的差异信息,便于理解和展示
这个类设计得很完整,既满足了与Steam API的数据交互需求,也提供了实用的数据管理功能。
AI 正在分析代码…
评论加载中...