in src/Azure.IIoT.OpcUa/src/Encoders/BaseAvroEncoder.cs [1420:1539]
protected virtual void WriteArray(BuiltInType builtInType, object valueToEncode)
{
static T[] Cast<T>(object objects)
{
if (objects is T[] r)
{
return r;
}
if (objects is object[] o)
{
return o.Cast<T>().ToArray();
}
if (objects is T t)
{
return new[] { t };
}
return Array.Empty<T>();
}
switch (builtInType)
{
case BuiltInType.Boolean:
WriteBooleanArray(null, Cast<bool>(valueToEncode));
break;
case BuiltInType.SByte:
WriteSByteArray(null, Cast<sbyte>(valueToEncode));
break;
case BuiltInType.Byte:
WriteByteArray(null, Cast<byte>(valueToEncode));
break;
case BuiltInType.Int16:
WriteInt16Array(null, Cast<short>(valueToEncode));
break;
case BuiltInType.UInt16:
WriteUInt16Array(null, Cast<ushort>(valueToEncode));
break;
case BuiltInType.Int32:
WriteInt32Array(null, Cast<int>(valueToEncode));
break;
case BuiltInType.UInt32:
WriteUInt32Array(null, Cast<uint>(valueToEncode));
break;
case BuiltInType.Int64:
WriteInt64Array(null, Cast<long>(valueToEncode));
break;
case BuiltInType.UInt64:
WriteUInt64Array(null, Cast<ulong>(valueToEncode));
break;
case BuiltInType.Float:
WriteFloatArray(null, Cast<float>(valueToEncode));
break;
case BuiltInType.Double:
WriteDoubleArray(null, Cast<double>(valueToEncode));
break;
case BuiltInType.String:
WriteStringArray(null, Cast<string>(valueToEncode));
break;
case BuiltInType.DateTime:
WriteDateTimeArray(null, Cast<DateTime>(valueToEncode));
break;
case BuiltInType.Guid:
WriteGuidArray(null, Cast<Uuid>(valueToEncode));
break;
case BuiltInType.ByteString:
WriteByteStringArray(null, Cast<byte[]>(valueToEncode));
break;
case BuiltInType.XmlElement:
WriteXmlElementArray(null, Cast<XmlElement>(valueToEncode));
break;
case BuiltInType.NodeId:
WriteNodeIdArray(null, Cast<NodeId>(valueToEncode));
break;
case BuiltInType.ExpandedNodeId:
WriteExpandedNodeIdArray(null, Cast<ExpandedNodeId>(valueToEncode));
break;
case BuiltInType.StatusCode:
WriteStatusCodeArray(null, Cast<StatusCode>(valueToEncode));
break;
case BuiltInType.QualifiedName:
WriteQualifiedNameArray(null, Cast<QualifiedName>(valueToEncode));
break;
case BuiltInType.LocalizedText:
WriteLocalizedTextArray(null, Cast<LocalizedText>(valueToEncode));
break;
case BuiltInType.ExtensionObject:
WriteExtensionObjectArray(null, Cast<ExtensionObject>(valueToEncode));
break;
case BuiltInType.DataValue:
WriteDataValueArray(null, Cast<DataValue>(valueToEncode));
break;
case BuiltInType.Enumeration:
// Check whether the value to encode is int array.
if (valueToEncode is int[] ints)
{
WriteEnumeratedArray(null, ints, null);
break;
}
var enums = Cast<Enum>(valueToEncode);
WriteEnumeratedArray(null, enums, null);
break;
case BuiltInType.Variant:
if (valueToEncode is Variant[] variants)
{
WriteVariantArray(null, variants);
break;
}
if (valueToEncode is object[] objects)
{
WriteVariantArray(null, objects.Select(v => new Variant(v)).ToArray());
break;
}
throw new EncodingException(
$"Unexpected type encountered while encoding array: {valueToEncode.GetType()}");
case BuiltInType.DiagnosticInfo:
WriteDiagnosticInfoArray(null, Cast<DiagnosticInfo>(valueToEncode));
break;
default:
throw new EncodingException(
$"Unexpected type encountered while encoding a Variant: {builtInType}");
}
}