OperateResult - Snet Docs

✅ OperateResult —— 操作结果

命名空间: Snet.Model.data | 类: EventArgsAsync, BaseModel, ResultModel, OperateResult

OperateResult 是 Snet 所有操作返回的标准结果封装。它构建于一个分层继承链之上,从异步事件参数到带状态信息的模型,再到带计时功能的完整操作结果。

📐 继承层次

EventArgsAsync (Snet.Model.@event)  -- 异步事件基础参数 + CancellationToken
  └── BaseModel                     -- Status (bool) + Message + Time
        └── ResultModel             -- + ResultData (object?)
              └── OperateResult     -- + RunTime (int, ms)

📚 类参考

EventArgsAsync

Snet 中所有事件参数的根类。位于 Snet.Model.@event

成员 类型 描述
CancellationToken CancellationToken 协作取消令牌(JSON 序列化时忽略)
Empty static EventArgsAsync 共享的空实例

BaseModel —— 基础模型

属性 类型 默认值 描述
Status bool false true = 成功,false = 失败
Message string? 可读的状态/错误消息
Time DateTime DateTime.Now 结果产生的时间戳

构造函数:

  • BaseModel()
  • BaseModel(BaseModel result) — 拷贝构造
  • BaseModel(bool status, string message)
  • BaseModel(bool status, string message, DateTime time)

方法: GetDetails(out string? message) → bool, GetDetails(out BaseModel result) → bool, ToString() → string (JSON)

var result = await op.ReadAsync(address);
if (result.Status)
{
    Console.WriteLine($"成功 — {result.Time}: {result.Message}");
}
else
{
    Console.WriteLine($"错误 — {result.Time}: {result.Message}");
}

ResultModel : BaseModel —— 结果模型

增加了类型化的结果数据载荷:

属性 类型 描述
ResultData object? 操作返回的数据载荷

构造函数:

  • ResultModel()
  • ResultModel(bool status, string? message, object? resultData = null)
  • ResultModel(bool status, string? message, DateTime time, object? resultData = null)

核心方法 — GetSource<T>(): 泛型提取 ResultData:

var values = result.GetSource<List<AddressValue>>();

8 个 GetDetails 重载 — 以不同组合解构 Status、Message 和 ResultData:

  • GetDetails(out string? message) → bool
  • GetDetails(out object? resultData) → bool
  • GetDetails<T>(out T? resultData) → bool
  • GetDetails(out object? resultData, out string? message) → bool
  • GetDetails<T>(out T? resultData, out string? message) → bool
  • GetDetails(out string? message, out object? resultData) → bool
  • GetDetails<T>(out string? message, out T? resultData) → bool

OperateResult : ResultModel —— 操作结果

最终结果类型。增加了运行时测量:

属性 类型 描述
RunTime int 函数运行时间,单位为毫秒 (ms)

构造函数:

  • OperateResult()
  • OperateResult(OperateResult result) — 拷贝构造
  • OperateResult(OperateResult result, int runTime) — 拷贝 + 时间覆盖
  • OperateResult(bool status, string message, int runTime, object? resultData = null)
var result = await op.ReadAsync(address);
Console.WriteLine($"状态: {result.Status}");        // bool
Console.WriteLine($"消息: {result.Message}");      // string?
Console.WriteLine($"时间: {result.Time}");         // DateTime
Console.WriteLine($"耗时: {result.RunTime} ms");   // int
Console.WriteLine($"数据: {result.ResultData}");   // object?

🏭 工厂方法

OperateResult 提供静态工厂方法。所有成功消息使用 LanguageHandler 进行国际化。

CreateSuccessResult —— 创建成功结果

// 仅带消息的成功结果
var ok = OperateResult.CreateSuccessResult("读取完成");

// 带类型化数据的成功结果(Status = true)
var result = OperateResult.CreateSuccessResult<AddressValue>("读取完成", addressValue);

CreateFailureResult —— 创建失败结果

// 带消息的失败结果
var fail = OperateResult.CreateFailureResult("设备无响应");

注意: Statusbool 类型 — CreateSuccessResult 设置 Status = trueCreateFailureResult 设置 Status = false。泛型和非泛型版本都接受 (string message, T? data) 参数顺序。

💡 使用模式

检查操作状态

var result = await op.ReadAsync(address);

if (result.Status)
{
    // 成功路径
    ProcessData(result.ResultData);
}
else
{
    // 错误路径
    LogError(result.Message);
}

批量读取地址

var address = new Address(new List<AddressDetails>
{
    new("温度", "40001", DataType.Float),
    new("湿度", "40002", DataType.Float)
});

var result = await op.ReadAsync(address);
if (result.Status)
{
    var data = result.GetSource<ConcurrentDictionary<string, AddressValue>>();
    foreach (var kv in data)
        Console.WriteLine($"{kv.Key} = {kv.Value.ResultValue}");
}

事件处理

op.OnDataEventAsync += async (sender, e) =>
{
    if (e.Status)
        await ProcessAsync(e.ResultData);
    else
        Console.WriteLine($"事件错误: {e.Message}");
};

计时监控

var result = await op.ReadAsync(address);
Console.WriteLine($"读取完成: {(result.Status ? "成功" : "失败")}");
Console.WriteLine($"耗时: {result.RunTime} ms");

🔧 内部实现:BegOperate / EndOperate

CoreUnify<O,D> 提供了 BegOperate() / EndOperate() 计时辅助方法,内部调用 Stopwatch 测量执行时间,构建 OperateResult.RunTime 值。这些是受保护方法,供所有 Operate 子类使用 — 用户代码无需直接调用。

🔗 相关文档