| File: System\Formats\Asn1\AsnWriter.Enumerated.cs | Web Access |
| Project: src\runtime\src\libraries\System.Formats.Asn1\src\System.Formats.Asn1.csproj (System.Formats.Asn1) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. namespace System.Formats.Asn1 { public sealed partial class AsnWriter { /// <summary> /// Write a non-[<see cref="FlagsAttribute"/>] enum value as an Enumerated with /// tag UNIVERSAL 10. /// </summary> /// <param name="value">The boxed enumeration value to write.</param> /// <param name="tag">The tag to write, or <see langword="null"/> for the default tag (Universal 10).</param> /// <exception cref="ArgumentNullException"> /// <paramref name="value"/> is <see langword="null"/>. /// </exception> /// <exception cref="ArgumentException"> /// <paramref name="tag"/>.<see cref="Asn1Tag.TagClass"/> is /// <see cref="TagClass.Universal"/>, but /// <paramref name="tag"/>.<see cref="Asn1Tag.TagValue"/> is not correct for /// the method. /// /// -or- /// /// <paramref name="value"/> is not a boxed enum value. /// /// -or- /// /// the unboxed type of <paramref name="value"/> is declared [<see cref="FlagsAttribute"/>]. /// </exception> /// <seealso cref="WriteEnumeratedValue(Enum,Asn1Tag?)"/> /// <seealso cref="WriteEnumeratedValue{T}(T,Asn1Tag?)"/> public void WriteEnumeratedValue(Enum value, Asn1Tag? tag = null) { ArgumentNullException.ThrowIfNull(value); WriteEnumeratedValue(tag?.AsPrimitive() ?? Asn1Tag.Enumerated, value.GetType(), value); } /// <summary> /// Write a non-[<see cref="FlagsAttribute"/>] enum value as an Enumerated with /// tag UNIVERSAL 10. /// </summary> /// <param name="value">The boxed enumeration value to write.</param> /// <param name="tag">The tag to write.</param> /// <exception cref="ArgumentNullException"> /// <paramref name="value"/> is <see langword="null"/>. /// </exception> /// <exception cref="ArgumentException"> /// <paramref name="tag"/>.<see cref="Asn1Tag.TagClass"/> is /// <see cref="TagClass.Universal"/>, but /// <paramref name="tag"/>.<see cref="Asn1Tag.TagValue"/> is not correct for /// the method. /// /// -or- /// /// <typeparamref name="TEnum"/> is not an enum. /// /// -or- /// /// <typeparamref name="TEnum"/> is declared [<see cref="FlagsAttribute"/>]. /// </exception> /// <seealso cref="WriteEnumeratedValue(Enum,Nullable{Asn1Tag})"/> public void WriteEnumeratedValue<TEnum>(TEnum value, Asn1Tag? tag = null) where TEnum : Enum { WriteEnumeratedValue(tag?.AsPrimitive() ?? Asn1Tag.Enumerated, typeof(TEnum), value); } // T-REC-X.690-201508 sec 8.4 private void WriteEnumeratedValue(Asn1Tag tag, Type tEnum, object value) { CheckUniversalTag(tag, UniversalTagNumber.Enumerated); Type backingType = tEnum.GetEnumUnderlyingType(); if (tEnum.IsDefined(typeof(FlagsAttribute), false)) { throw new ArgumentException( SR.Argument_EnumeratedValueRequiresNonFlagsEnum, nameof(tEnum)); } if (backingType == typeof(ulong)) { ulong numericValue = Convert.ToUInt64(value); // T-REC-X.690-201508 sec 8.4 WriteNonNegativeIntegerCore(tag, numericValue); } else { // All other types fit in a (signed) long. long numericValue = Convert.ToInt64(value); // T-REC-X.690-201508 sec 8.4 WriteIntegerCore(tag, numericValue); } } } }