Commit 9d165245 authored by shrabbit's avatar shrabbit
Browse files

添加 DeviceInfo.Core 项目并实现设备信息获取辅助类和接口

parent 8b18544a
Loading
Loading
Loading
Loading
+43 −0
Original line number Diff line number Diff line
using System;
using System.Text.Json.Nodes;
using System.Threading;
using System.Threading.Tasks;

namespace DeviceInfo.Core;

/// <summary>
/// 提供了获取设备信息的帮助方法。此类主要用于通过异步方式收集指定类型的信息,并将其转换为JSON格式的对象。
/// </summary>
/// <remarks>
/// 该类包含一个静态方法Get,允许传入一个泛型参数和一个处理委托,用于构建特定类型信息的JSON表示。此方法支持取消操作,增加了程序在执行长时间运行任务时的灵活性。
/// </remarks>
public static class DeviceInfoHelper
{
    /// <summary>
    /// 通过给定的委托和取消令牌异步获取指定类型的信息,并以JSON格式返回。
    /// </summary>
    /// <typeparam name="TInfo">要收集信息的具体类型,必须有一个无参数的公共构造函数。</typeparam>
    /// <param name="node">一个处理委托,接受两个参数:TInfo类型的实例和JsonNode对象。此委托负责将TInfo实例的信息填充到JsonNode中。</param>
    /// <param name="ct">CancellationToken,用于请求取消正在进行的操作。</param>
    /// <returns>返回一个Task,其结果为包含了由提供的委托填充的数据的JsonNode对象。</returns>
    public static async Task<JsonNode> Get<TInfo>(Action<TInfo, JsonNode> node, CancellationToken ct)
        where TInfo : new()
    {
        var info = await Task.Run(() => new TInfo(), ct);
        var obj = new JsonObject();
        node(info, obj);
        return obj;
    }

    extension<T>(T) where T : new()
    {
        public static async Task<JsonNode> DirectGet(Action<T, JsonNode> node, CancellationToken ct)
        
        {
            var info = await Task.Run(() => new T(), ct);
            var obj = new JsonObject();
            node(info, obj);
            return obj;
        }
    }
}
 No newline at end of file
+48 −0
Original line number Diff line number Diff line
using System.Text.Json.Nodes;
using System.Threading;
using System.Threading.Tasks;
using Hardware.Info;

namespace DeviceInfo.Core.Infos;

/// <summary>
/// IInfoItem 接口定义了获取设备信息项的基本结构。任何实现此接口的类都必须提供名称、描述、简短命令以及异步获取 JSON 格式数据的功能。
/// </summary>
/// <remarks>
/// 通过实现 IInfoItem 接口,具体的类能够标准化它们对外提供的信息格式和获取方式,便于统一管理和调用。GetJsonAsync 方法允许以异步方式获取信息,提高了程序在处理大量或复杂数据时的响应性能。
/// </remarks>
public interface IInfoItem
{
    /// <summary>
    /// 获取或设置当前信息项的名称。
    /// </summary>
    /// <remarks>
    /// 该属性返回一个字符串,表示信息项的唯一标识名。在实现 IInfoItem 接口的具体类中,此属性应返回一个能够清晰描述信息项类型的名称。
    /// </remarks>
    string Name { get; }

    /// <summary>
    /// 获取或设置当前信息项的描述。
    /// </summary>
    /// <remarks>
    /// 该属性返回一个字符串,提供了关于信息项功能和用途的简要说明。在实现 IInfoItem 接口的具体类中,此属性应包含对信息项所表示数据的清晰描述。
    /// </remarks>
    string Description { get; }

    /// <summary>
    /// 获取或设置用于简短标识当前信息项的命令。
    /// </summary>
    /// <remarks>
    /// 该属性返回一个字符串,作为信息项的简短命令。在实现 IInfoItem 接口的具体类中,此属性应提供一个简洁的命令字符串,以便快速识别和引用特定的信息项。
    /// </remarks>
    string ShortCmd { get; }

    /// <summary>
    /// 以异步方式获取当前信息项的JSON表示。
    /// </summary>
    /// <param name="json">主机会构造一个空JSON对象,减少创建Json代码</param>
    /// <param name="ct">用于请求取消操作的CancellationToken。</param>
    /// <param name="info">硬件信息类,如果使用的是Hardware.Info库获取的设备信息应使用该参数</param>
    /// <returns>返回一个Task,其结果为包含信息项数据的JsonNode对象。</returns>
    Task<JsonNode> GetJsonAsync(HardwareInfo info, JsonNode json, CancellationToken ct);
}
 No newline at end of file
+6 −0
Original line number Diff line number Diff line
namespace DeviceInfo.Core.Infos;

public class InfoHost
{
    private IInfoItem[] _items;
}
 No newline at end of file
+1 −0
Original line number Diff line number Diff line
<Solution>
  <Project Path="DeviceInfo.Core/DeviceInfo.Core.csproj" />
  <Project Path="DeviceInfo/DeviceInfo.csproj" />
</Solution>