--- source_files: - Common/DTS.Common.Serialization/IRIGCH10/Attributes/DescriptionDecoder.cs - Common/DTS.Common.Serialization/IRIGCH10/Attributes/PacketHeaderValueAttribute.cs - Common/DTS.Common.Serialization/IRIGCH10/Attributes/DataTypeVersionValueAttribute.cs generated_at: "2026-04-16T03:43:04.052592+00:00" model: "Qwen/Qwen3-Coder-Next-FP8" schema_version: 1 sha256: "32d5e734af040685" --- # IRIG CH10 Attribute Decoders Documentation ## 1. Purpose This module provides utility classes for extracting metadata annotations from .NET `enum` values, specifically tailored for IRIG CH10 data format compliance. It enables serialization logic to retrieve human-readable descriptions, maximum length constraints, packet header values, and data type version numbers associated with enum fields via custom attributes (`DescriptionAttribute`, `MaxLengthAttribute`, `PacketHeaderValueAttribute`, `DataTypeVersionValueAttribute`). These utilities bridge the gap between strongly-typed enum definitions and the string/byte-level requirements of the IRIG CH10 specification (e.g., TMATS file generation, packet header construction). ## 2. Public Interface ### `DescriptionDecoder.GetDescription(Enum value)` - **Signature**: `public static string GetDescription(Enum value)` - **Behavior**: Returns the `DescriptionAttribute.Description` value attached to the enum field corresponding to `value`. If no such attribute exists, returns the enum's `ToString()` representation. ### `MaxLengthDecoder.GetMaxLength(Enum value)` - **Signature**: `public static int GetMaxLength(Enum value)` - **Behavior**: Returns the `Length` property of the `MaxLengthAttribute` attached to the enum field corresponding to `value`. If no such attribute exists, returns `0`. ### `PacketHeaderValueAttribute.GetPacketHeaderValue(Enum value)` - **Signature**: `public static byte GetPacketHeaderValue(Enum value)` - **Behavior**: Returns the `PacketHeaderValue` property of the `PacketHeaderValueAttribute` attached to the enum field corresponding to `value`. If no such attribute exists, returns `Default.PacketHeaderValue` (which is `0x00`). ### `DataTypeVersionValueAttribute.GetDataTypeVersionValue(Enum value)` - **Signature**: `public static byte GetDataTypeVersionValue(Enum value)` - **Behavior**: Returns the `DataTypeVersionValue` property of the `DataTypeVersionValueAttribute` attached to the enum field corresponding to `value`. If no such attribute exists, returns `Default.DataTypeVersionValue` (which is `0x00`). > **Note**: The static methods `GetPacketHeaderValue` and `GetDataTypeVersionValue` are *instance methods* on their respective attribute classes, not static methods on the class itself. They are called on the attribute class (e.g., `PacketHeaderValueAttribute.GetPacketHeaderValue(someEnum)`) and operate on the enum value passed. ## 3. Invariants - **Enum Field Resolution**: All decoder methods assume the `Enum` value corresponds to a valid field name in its declaring type (via `value.ToString()` → `GetField()`). If the enum value is invalid or the field name resolution fails (e.g., due to compiler-generated names or custom `ToString()` overrides), behavior is undefined (likely throws `NullReferenceException` or returns incorrect data). - **Attribute Uniqueness**: Methods return the *first* attribute found via `GetCustomAttributes(...)`. If multiple attributes of the same type exist on a single field, only the first is used. - **Default Values**: When no attribute is present: - `GetDescription` falls back to `value.ToString()` - `GetMaxLength` returns `0` - `GetPacketHeaderValue` returns `0x00` - `GetDataTypeVersionValue` returns `0x00` - **Attribute Scope**: `PacketHeaderValueAttribute` and `DataTypeVersionValueAttribute` are decorated with `[AttributeUsage(AttributeTargets.All)]`, meaning they *can* be applied to any program element (not just enums), though the decoders assume usage on enum fields. ## 4. Dependencies ### Dependencies *of* this module: - **System.ComponentModel**: For `DescriptionAttribute` - **System.ComponentModel.DataAnnotations**: For `MaxLengthAttribute` - **System.Linq**: For `Any()` and `First()` LINQ methods - **System.Reflection**: For `GetType()`, `GetField()`, `GetCustomAttributes()` ### Dependencies *on* this module: - Other IRIG CH10 serialization components (not visible in source) that rely on these decoders to: - Generate TMATS string descriptions from enums - Enforce or suggest max-length constraints for string fields - Construct packet headers (e.g., for packet type/version identification) - Serialize data type version information per CH10 spec ## 5. Gotchas - **No null-safety**: All methods call `value.ToString()` and `GetField(...)` without validating that `value` is non-null or that the field exists. Passing `null` or an invalid enum value will cause a `NullReferenceException`. - **Case sensitivity**: `value.ToString()` is used directly for `GetField()`. If the enum field name differs in casing (e.g., due to compiler optimizations or custom `ToString()` overrides), field resolution may fail. - **`MaxLengthAttribute` is advisory only**: As noted in the `MaxLengthDecoder` summary, CH10 specifies max lengths as *suggestions*, not hard requirements. Consumers should not assume enforcement. - **Default attribute behavior**: The `Default` static fields (`PacketHeaderValueAttribute.Default`, `DataTypeVersionValueAttribute.Default`) are *new instances* with `0x00` values—not singleton references to a shared default. This is safe but worth noting for equality comparisons. - **No validation of attribute targets**: While `PacketHeaderValueAttribute` and `DataTypeVersionValueAttribute` allow `AttributeTargets.All`, their static `Get*Value` methods assume usage on enum fields. Applying them to non-enum members (e.g., classes, methods) will likely cause runtime errors. - **No support for inherited attributes**: `GetCustomAttributes(..., false)` excludes inherited attributes. If attributes are defined on base enum values (in inheritance hierarchies), they will be ignored. None identified from source alone beyond those above.