Variant
Variant 是 OPC UA 的通用值容器, 覆盖 OPC UA 全部内置数据类型. SDK 用它在 C# 与 native 之间传值.
配套
- 包装值 + 时间戳 + 状态请看 DataValue.
- 标准节点常量请看 WellKnownNodes.
公共属性
| 类别 | 属性 | 类型 | 访问 | 说明 |
|---|---|---|---|---|
| 状态 | IsNull | bool | R | 是否空 |
IsArray | bool | R | 是否数组 | |
| 类型 | DataType | BuiltinType | R | 内置类型 |
ArrayLength | int | R | 数组长度 (0 = 标量) |
构造 (标量)
new Variant(true) // Boolean
new Variant((sbyte)-1) // SByte
new Variant((byte)255) // Byte
new Variant((short)42) // Int16
new Variant((ushort)42) // UInt16
new Variant(42) // Int32
new Variant(42u) // UInt32
new Variant(42L) // Int64
new Variant(42uL) // UInt64
new Variant(3.14f) // Float
new Variant(3.14) // Double
new Variant("hello") // String
new Variant(DateTime.UtcNow) // DateTime
new Variant(Guid.NewGuid()) // Guid
new Variant(new byte[]{...}) // ByteString
构造 (数组)
new Variant(new[] { 1.0, 2.0, 3.0 }) // Double[]
new Variant(new[] { "a", "b", "c" }) // String[]
new Variant(new[] { true, false, true }) // Boolean[]
读取 (强类型)
v.AsBoolean
v.AsSByte / v.AsByte
v.AsInt16 / v.AsUInt16
v.AsInt32 / v.AsUInt32
v.AsInt64 / v.AsUInt64
v.AsFloat / v.AsDouble
v.AsString
v.AsDateTime
v.AsGuid
v.AsByteString // byte[]
// 数组
v.AsDoubleArray
v.AsStringArray
// ...
类型不匹配抛 InvalidCastException.
ToString
Variant.ToString() 按 DataType 智能格式化:
| DataType | 输出示例 |
|---|---|
| Double | 3.14 |
| String | "hello" |
| DateTime | 2026-04-25T12:00:00Z |
| ByteString | Bytes(N=4) |
| Array | [1, 2, 3, ...] |
内存所有权
Variant 包装 native handle. 从 ua.Read / ua.Call 等返回的 Variant 持有 owns=true, 必须 Dispose. 自己 new Variant(...) 构造的也持有, Dispose.
using var v = new Variant(42);
ua.Write("ns=2;s=X", v);
或简写 (Write 会内部 dispose):
ua.Write("ns=2;s=X", new Variant(42)); // SDK 内部已确保释放
BuiltinType 完整清单
Null, Boolean, SByte, Byte, Int16, UInt16, Int32, UInt32, Int64, UInt64,
Float, Double, String, DateTime, Guid, ByteString, XmlElement,
NodeId, ExpandedNodeId, StatusCode, QualifiedName, LocalizedText,
ExtensionObject, DataValue, Variant, DiagnosticInfo
数字 0..25, 见 SDK 源码 Enums.cs.
ExtensionObject (复杂结构)
OPC UA Server 自定义 Struct DataType 通过 ExtensionObject 包装. 当前 SDK 提供基础 ExtensionObject 容器, 完整 schema 解析在后续版本.