protected virtual void WriteArray()

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}");
            }
        }