Basic enum implementation for a generic class that may provide additional properties, methods and implicit conversion operators as needed.
Each enum member must be defined as public, static fields, initialised with an instance of the enum with the value they are supposed to represent. Optionally, the DescriptionAttribute attribute may be used to set a description. At runtime, the name of each member is automatically set to the name of the corresponding field and the description field it set to the value of the DescriptionAttribute, if any.
An ArgumentException is thrown during static initialisation if two members use the same value.