public virtual void WriteArray()

in src/Azure.IIoT.OpcUa/src/Encoders/BaseAvroEncoder.cs [760:1194]


        public virtual void WriteArray(string? fieldName, object array,
            int valueRank, BuiltInType builtInType)
        {
            var rank = SchemaUtils.GetRank(valueRank);
            if (rank == SchemaRank.Collection)
            {
                switch (builtInType)
                {
                    case BuiltInType.Boolean:
                        WriteArray(fieldName, (bool[])array, v => WriteBoolean(null, v));
                        break;
                    case BuiltInType.SByte:
                        WriteArray(fieldName, (sbyte[])array, v => WriteSByte(null, v));
                        break;
                    case BuiltInType.Byte:
                        WriteArray(fieldName, (byte[])array, v => WriteByte(null, v));
                        break;
                    case BuiltInType.Int16:
                        WriteArray(fieldName, (short[])array, v => WriteInt16(null, v));
                        break;
                    case BuiltInType.UInt16:
                        WriteArray(fieldName, (ushort[])array, v => WriteUInt16(null, v));
                        break;
                    case BuiltInType.Int32:
                        WriteArray(fieldName, (int[])array, v => WriteInt32(null, v));
                        break;
                    case BuiltInType.UInt32:
                        WriteArray(fieldName, (uint[])array, v => WriteUInt32(null, v));
                        break;
                    case BuiltInType.Int64:
                        WriteArray(fieldName, (long[])array, v => WriteInt64(null, v));
                        break;
                    case BuiltInType.UInt64:
                        WriteArray(fieldName, (ulong[])array, v => WriteUInt64(null, v));
                        break;
                    case BuiltInType.Float:
                        WriteArray(fieldName, (float[])array, v => WriteFloat(null, v));
                        break;
                    case BuiltInType.Double:
                        WriteArray(fieldName, (double[])array, v => WriteDouble(null, v));
                        break;
                    case BuiltInType.DateTime:
                        WriteArray(fieldName, (DateTime[])array, v => WriteDateTime(null, v));
                        break;
                    case BuiltInType.Guid:
                        WriteArray(fieldName, (Uuid[])array, v => WriteGuid(null, v));
                        break;
                    case BuiltInType.String:
                        WriteArray(fieldName, (string[])array, v => WriteString(null, v));
                        break;
                    case BuiltInType.ByteString:
                        WriteArray(fieldName, (byte[][])array, v => WriteByteString(null, v));
                        break;
                    case BuiltInType.QualifiedName:
                        WriteArray(fieldName, (QualifiedName[])array, v => WriteQualifiedName(null, v));
                        break;
                    case BuiltInType.LocalizedText:
                        WriteArray(fieldName, (LocalizedText[])array, v => WriteLocalizedText(null, v));
                        break;
                    case BuiltInType.NodeId:
                        WriteArray(fieldName, (NodeId[])array, v => WriteNodeId(null, v));
                        break;
                    case BuiltInType.ExpandedNodeId:
                        WriteArray(fieldName, (ExpandedNodeId[])array, v => WriteExpandedNodeId(null, v));
                        break;
                    case BuiltInType.StatusCode:
                        WriteArray(fieldName, (StatusCode[])array, v => WriteStatusCode(null, v));
                        break;
                    case BuiltInType.XmlElement:
                        WriteArray(fieldName, (XmlElement[])array, v => WriteXmlElement(null, v));
                        break;
                    case BuiltInType.Variant:
                        // try to write IEncodeable Array
                        if (array is IEncodeable[] encodeableArray)
                        {
                            WriteEncodeableArray(fieldName, encodeableArray,
                                array.GetType().GetElementType());
                            return;
                        }
                        WriteVariantArray(null, (Variant[])array);
                        break;
                    case BuiltInType.Enumeration:
                        if (array is Enum[] enums)
                        {
                            WriteArray(fieldName, enums, v => WriteEnumerated(null, v));
                            break;
                        }
                        else if (array is int[] values)
                        {
                            WriteArray(fieldName, values, v => WriteEnumerated(null, v));
                            break;
                        }
                        throw new EncodingException(
                            "Unexpected type encountered while encoding an Enumeration Array.");
                    case BuiltInType.ExtensionObject:
                        WriteArray(fieldName, (ExtensionObject[])array, v => WriteExtensionObject(null, v));
                        break;
                    case BuiltInType.DiagnosticInfo:
                        WriteArray(fieldName, (DiagnosticInfo[])array, v => WriteDiagnosticInfo(null, v));
                        break;
                    case BuiltInType.DataValue:
                        WriteArray(fieldName, (DataValue[])array, v => WriteDataValue(null, v));
                        break;
                    default:
                        // try to write IEncodeable Array
                        if (array is IEncodeable[] encodeableArray2)
                        {
                            WriteEncodeableArray(fieldName, encodeableArray2,
                                array.GetType().GetElementType());
                            return;
                        }
                        if (array == null)
                        {
                            // write zero dimension
                            WriteInt32(null, -1);
                            return;
                        }
                        throw new EncodingException(
                            "Unexpected type encountered while encoding an Array with " +
                            $"BuiltInType: {builtInType}");
                }
            }
            else if (rank == SchemaRank.Matrix)
            {
                /* Multi-dimensional Arrays are encoded as an Int32 Array containing the dimensions followed by
                 * a list of all the values in the Array. The total number of values is equal to the
                 * product of the dimensions.
                 * The number of values is 0 if one or more dimension is less than or equal to 0.*/

                var matrix = array as Matrix;
                if (matrix == null)
                {
                    if (array is not Array multiArray || multiArray.Rank != valueRank)
                    {
                        // there is no Dimensions to write
                        WriteInt32("Dimensions", -1);
                        return;
                    }
                    matrix = new Matrix(multiArray, builtInType);
                }

                // Write the Dimensions
                WriteInt32Array(null, matrix.Dimensions);

                switch (matrix.TypeInfo.BuiltInType)
                {
                    case BuiltInType.Boolean:
                        {
                            var values = (bool[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteBoolean(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.SByte:
                        {
                            var values = (sbyte[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteSByte(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Byte:
                        {
                            var values = (byte[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteByte(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Int16:
                        {
                            var values = (short[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteInt16(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.UInt16:
                        {
                            var values = (ushort[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteUInt16(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Enumeration:
                        {
                            if (matrix.Elements is Enum[] values)
                            {
                                for (var ii = 0; ii < values.Length; ii++)
                                {
                                    WriteEnumerated(null, values[ii]);
                                }
                                break;
                            }
                        }
                        {
                            if (matrix.Elements is int[] values)
                            {
                                for (var ii = 0; ii < values.Length; ii++)
                                {
                                    WriteEnumerated(null, values[ii]);
                                }
                                break;
                            }
                        }
                        throw new EncodingException(
                            "Unexpected type encountered while encoding an Enumeration Matrix.");
                    case BuiltInType.Int32:
                        {
                            var values = (int[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteInt32(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.UInt32:
                        {
                            var values = (uint[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteUInt32(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Int64:
                        {
                            var values = (long[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteInt64(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.UInt64:
                        {
                            var values = (ulong[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteUInt64(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Float:
                        {
                            var values = (float[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteFloat(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Double:
                        {
                            var values = (double[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteDouble(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.String:
                        {
                            var values = (string[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteString(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.DateTime:
                        {
                            var values = (DateTime[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteDateTime(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Guid:
                        {
                            var values = (Uuid[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteGuid(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.ByteString:
                        {
                            var values = (byte[][])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteByteString(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.XmlElement:
                        {
                            var values = (XmlElement[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteXmlElement(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.NodeId:
                        {
                            var values = (NodeId[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteNodeId(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.ExpandedNodeId:
                        {
                            var values = (ExpandedNodeId[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteExpandedNodeId(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.StatusCode:
                        {
                            var values = (StatusCode[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteStatusCode(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.QualifiedName:
                        {
                            var values = (QualifiedName[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteQualifiedName(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.LocalizedText:
                        {
                            var values = (LocalizedText[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteLocalizedText(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.ExtensionObject:
                        {
                            var values = (ExtensionObject[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteExtensionObject(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.DataValue:
                        {
                            var values = (DataValue[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteDataValue(null, values[ii]);
                            }
                            break;
                        }
                    case BuiltInType.Variant:
                        {
                            if (matrix.Elements is Variant[] variants)
                            {
                                for (var ii = 0; ii < variants.Length; ii++)
                                {
                                    WriteVariant(null, variants[ii]);
                                }
                                break;
                            }

                            // try to write IEncodeable Array
                            if (matrix.Elements is IEncodeable[] encodeableArray)
                            {
                                for (var ii = 0; ii < encodeableArray.Length; ii++)
                                {
                                    WriteEncodeable(null, encodeableArray[ii], null);
                                }
                                break;
                            }

                            if (matrix.Elements is object[] objects)
                            {
                                for (var ii = 0; ii < objects.Length; ii++)
                                {
                                    WriteVariant(null, new Variant(objects[ii]));
                                }
                                break;
                            }
                            throw new EncodingException(
                                "Unexpected type encountered while encoding a Matrix.");
                        }
                    case BuiltInType.DiagnosticInfo:
                        {
                            var values = (DiagnosticInfo[])matrix.Elements;
                            for (var ii = 0; ii < values.Length; ii++)
                            {
                                WriteDiagnosticInfo(null, values[ii]);
                            }
                            break;
                        }
                    default:
                        {
                            // try to write IEncodeable Array
                            if (matrix.Elements is IEncodeable[] encodeableArray)
                            {
                                for (var ii = 0; ii < encodeableArray.Length; ii++)
                                {
                                    WriteEncodeable(null, encodeableArray[ii], null);
                                }
                                break;
                            }
                            throw new EncodingException(
                                "Unexpected type encountered while encoding a Matrix " +
                                $"with BuiltInType: {matrix.TypeInfo.BuiltInType}");
                        }
                }
            }
        }