public Array? ReadArray()

in src/Azure.IIoT.OpcUa/src/Encoders/JsonDecoderEx.cs [693:824]


        public Array? ReadArray(string? fieldName, int valueRank, BuiltInType builtInType,
            Type? systemType, ExpandedNodeId? encodeableTypeId)
        {
            if (valueRank == ValueRanks.OneDimension)
            {
                switch (builtInType)
                {
                    case BuiltInType.Boolean:
                        return ReadBooleanArray(fieldName).ToArray();
                    case BuiltInType.SByte:
                        return ReadSByteArray(fieldName).ToArray();
                    case BuiltInType.Byte:
                        return ReadByteArray(fieldName).ToArray();
                    case BuiltInType.Int16:
                        return ReadInt16Array(fieldName).ToArray();
                    case BuiltInType.UInt16:
                        return ReadUInt16Array(fieldName).ToArray();
                    case BuiltInType.Int32:
                        return ReadInt32Array(fieldName).ToArray();
                    case BuiltInType.UInt32:
                        return ReadUInt32Array(fieldName).ToArray();
                    case BuiltInType.Int64:
                        return ReadInt64Array(fieldName).ToArray();
                    case BuiltInType.UInt64:
                        return ReadUInt64Array(fieldName).ToArray();
                    case BuiltInType.Float:
                        return ReadFloatArray(fieldName).ToArray();
                    case BuiltInType.Double:
                        return ReadDoubleArray(fieldName).ToArray();
                    case BuiltInType.String:
                        return ReadStringArray(fieldName).ToArray();
                    case BuiltInType.DateTime:
                        return ReadDateTimeArray(fieldName).ToArray();
                    case BuiltInType.Guid:
                        return ReadGuidArray(fieldName).ToArray();
                    case BuiltInType.ByteString:
                        return ReadByteStringArray(fieldName).ToArray();
                    case BuiltInType.XmlElement:
                        return ReadXmlElementArray(fieldName).ToArray();
                    case BuiltInType.NodeId:
                        return ReadNodeIdArray(fieldName).ToArray();
                    case BuiltInType.ExpandedNodeId:
                        return ReadExpandedNodeIdArray(fieldName).ToArray();
                    case BuiltInType.StatusCode:
                        return ReadStatusCodeArray(fieldName).ToArray();
                    case BuiltInType.QualifiedName:
                        return ReadQualifiedNameArray(fieldName).ToArray();
                    case BuiltInType.LocalizedText:
                        return ReadLocalizedTextArray(fieldName).ToArray();
                    case BuiltInType.DataValue:
                        return ReadDataValueArray(fieldName).ToArray();
                    case BuiltInType.Enumeration:
                        return ReadInt32Array(fieldName).ToArray();
                    case BuiltInType.Variant:
                        return ReadVariantArray(fieldName).ToArray();
                    case BuiltInType.ExtensionObject:
                        return ReadExtensionObjectArray(fieldName).ToArray();
                    case BuiltInType.DiagnosticInfo:
                        return ReadDiagnosticInfoArray(fieldName).ToArray();
                    default:
                        throw new DecodingException(
                            $"Cannot decode unknown type in Array object with BuiltInType: {builtInType}.");
                }
            }
            else if (valueRank > ValueRanks.OneDimension)
            {
                if (!ReadArrayField(fieldName, out var array))
                {
                    return null;
                }
                var elements = new List<object>();
                var dimensions = new List<int>();
                ReadMatrixPart(fieldName, array, builtInType, ref elements, ref dimensions, 0);

                switch (builtInType)
                {
                    case BuiltInType.Boolean:
                        return new Matrix(elements.Cast<bool>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.SByte:
                        return new Matrix(elements.Cast<sbyte>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Byte:
                        return new Matrix(elements.Cast<byte>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Int16:
                        return new Matrix(elements.Cast<short>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.UInt16:
                        return new Matrix(elements.Cast<ushort>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Int32:
                        return new Matrix(elements.Cast<int>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.UInt32:
                        return new Matrix(elements.Cast<uint>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Int64:
                        return new Matrix(elements.Cast<long>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.UInt64:
                        return new Matrix(elements.Cast<ulong>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Float:
                        return new Matrix(elements.Cast<float>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Double:
                        return new Matrix(elements.Cast<double>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.String:
                        return new Matrix(elements.Cast<string>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.DateTime:
                        return new Matrix(elements.Cast<DateTime>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Guid:
                        return new Matrix(elements.Cast<Uuid>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.ByteString:
                        return new Matrix(elements.Cast<byte[]>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.XmlElement:
                        return new Matrix(elements.Cast<XmlElement>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.NodeId:
                        return new Matrix(elements.Cast<NodeId>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.ExpandedNodeId:
                        return new Matrix(elements.Cast<ExpandedNodeId>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.StatusCode:
                        return new Matrix(elements.Cast<StatusCode>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.QualifiedName:
                        return new Matrix(elements.Cast<QualifiedName>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.LocalizedText:
                        return new Matrix(elements.Cast<LocalizedText>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.DataValue:
                        return new Matrix(elements.Cast<DataValue>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Enumeration:
                        return new Matrix(elements.Cast<int>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.Variant:
                        return new Matrix(elements.Cast<Variant>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.ExtensionObject:
                        return new Matrix(elements.Cast<ExtensionObject>().ToArray(), builtInType, [.. dimensions]).ToArray();
                    case BuiltInType.DiagnosticInfo:
                        return new Matrix(elements.Cast<DiagnosticInfo>().ToArray(), builtInType, [.. dimensions]).ToArray();
                }
            }
            return null;
        }