🔧 工具库
Snet.Utility 提供 150+ 扩展方法与工具类,涵盖工业数据操作、字节处理、网络操作、JSON/XML 序列化及深度对象比较。
包名: Snet.Utility
目标框架: .NET 8.0 / .NET 10.0
依赖项: Newtonsoft.Json 13.0.4, protobuf-net 3.2.56
▶️ 快速开始
dotnet add package Snet.Utility
常用扩展方法,对所有对象可用:
using Snet.Utility;
// JSON 序列化
var json = myObject.ToJson(true); // 格式化输出
var obj = json.ToJsonEntity<MyType>(); // 反序列化
// 深度对象比较
var result = expected.Comparer(actual);
Console.WriteLine($"相等: {result.result}, 差异: {result.message}");
// DateTime 格式化
string dateStr = DateTime.Now.ToDateTimeString();
⚙️ 安装
Snet.Utility 是 Snet.Core 的传递依赖。若已安装 Snet.Core,则无需额外安装。
🧠 核心概念
扩展方法
通过 using Snet.Utility 使用:
| 方法 | 描述 |
|---|---|
ToJson(bool indented) |
序列化为 JSON 字符串(Newtonsoft.Json) |
ToJsonEntity<T>() |
反序列化 JSON 字符串为类型对象 |
ToXml() |
序列化为 XML 字符串 |
ToXmlEntity<T>() |
反序列化 XML 字符串为类型对象 |
ToBytes() |
字符串转字节数组(默认 UTF-8) |
ToBytes(Encoding) |
指定编码转字节数组 |
ToDateTimeString() |
DateTime 格式化为 "yyyy-MM-dd HH:mm:ss" |
Comparer<T>(T other) |
深度比较,返回 (bool result, string message) |
处理器类
| 处理器 | 用途 |
|---|---|
ByteHandler |
字节数组操作、十六进制转换、字节序 |
NetHandler |
Ping、DNS 解析、端口连通性检查 |
FileHandler |
文件读写/追加/复制/删除 |
FtpHandler |
FTP 上传/下载 |
TimeHandler |
DateTime 转换、秒表计时、时区 |
XmlHandler |
XML 序列化辅助 |
SvgHandler |
SVG 渲染工具 |
RMAHandler |
资源管理自动化 |
对象比较框架
位于 Snet.Utility.comparer 的递归深度比较引擎:
- 可配置深度的
ComparisonConfig - 单属性自定义验证
- 文本与 HTML 差异报告
- 类型专属比较器
- 忽略模式与排除规则
var config = new ComparisonConfig { MaxDifferences = 100, MaxDepth = 5 };
var result = expected.CompareTo(actual, config);
if (!result.AreEqual)
foreach (var diff in result.Differences)
Console.WriteLine($"{diff.PropertyName}: {diff.Object1Value} != {diff.Object2Value}");
📚 API 参考
ByteHandler
| 方法 | 描述 |
|---|---|
ByteToHexString(byte[]) |
字节数组转十六进制字符串 |
HexStringToByte(string) |
十六进制字符串转字节数组 |
ByteReverse(byte[]) |
反转字节数组(大小端转换) |
BoolArrayToByte(bool[]) |
8位布尔数组转字节 |
ByteToBoolArray(byte) |
字节转8位布尔数组 |
NetHandler
| 方法 | 描述 |
|---|---|
Ping(string, int) |
Ping 主机,返回延迟 ms |
DnsResolve(string) |
DNS 解析,返回 IP 地址 |
IsPortOpen(string, int, int) |
检查 TCP 端口是否开放 |
GetLocalIP() |
获取本机 IP 地址 |
FileHandler
| 方法 | 描述 |
|---|---|
ReadAllText(string) |
读取文件内容 |
WriteAllText(string, string) |
写入字符串到文件 |
AppendAllText(string, string) |
追加内容到文件 |
CopyFile(string, string, bool) |
带覆盖选项的复制 |
TimeHandler
| 方法 | 描述 |
|---|---|
StartRecord() |
启动秒表计时 |
StopRecord() |
停止并返回耗时 ms |
ToDateTimeString(DateTime) |
格式化 "yyyy-MM-dd HH:mm:ss" |
UnixTimestampToDateTime(long) |
Unix 时间戳转 DateTime |
💻 代码示例
JSON 序列化往返
using Snet.Utility;
var device = new { Name = "PLC-001", Ip = "192.168.1.100", Port = 502 };
string json = device.ToJson(true);
var restored = json.ToJsonEntity<DeviceConfig>();
深度比较
var diff = oldConfig.Comparer(newConfig);
Console.WriteLine($"相等: {diff.result}\n变化: {diff.message}");
字节操作
byte[] data = { 0x01, 0x02, 0x03, 0x04 };
string hex = ByteHandler.ByteToHexString(data); // "01020304"
byte[] rev = ByteHandler.ByteReverse(data); // { 0x04, 0x03, 0x02, 0x01 }
网络检查
long latency = NetHandler.Ping("192.168.1.100", 3000);
bool isOpen = NetHandler.IsPortOpen("192.168.1.100", 502, 2000);
❓ FAQ
1. ToJson 与 System.Text.Json 如何选择?
ToJson() 使用 Newtonsoft.Json 提供便捷调用。对于性能敏感场景,可直接使用 System.Text.Json 配合源生成器。
2. Comparer 是否线程安全?
并发读取安全。若被比较对象可变且在比较期间被修改,结果可能不一致——建议使用不可变快照。
3. ByteHandler 是否支持所有字节序?
ByteReverse 处理字节级反转。字级字节交换(PLC 常用)请使用 Snet.Core 的 BytesTransformHandler(ABCD/BADC/CDAB/DCBA)。
📅 版本历史
| 日期 | 版本 | 变更 |
|---|---|---|
| 2026-07-23 | — | .NET 8/10。Newtonsoft.Json 13.0.4, protobuf-net 3.2.56。150+ 扩展方法,8 个处理器类,完整对象比较框架。 |
