Checking whether an enum value exists by a parse test in C#
March 15, 2016 1 Comment
Say you have the following ShipmentOption enumeration:
public enum ShipmentOption { Land, Sea, Air }
By default each enumeration value will have an integer representation starting with 0. So 0 corresponds to Land, 1 to Sea and 2 to Air. In addition, each enumeration entry can be stringified such as “Land”, “Sea” and “Air”.
The Enum class has a TryParse method that helps you convert the string representation of the enumeration into the actual enumeration value.
Here’s an example of converting a string into an enum:
public void SendShipment(string shipmentType) { ShipmentOption shipmentOption; if (Enum.TryParse<ShipmentOption>(Convert.ToString(shipmentType), true, out shipmentOption)) { Console.WriteLine("This type is defined: {0}", shipmentOption); } else { throw new InvalidEnumArgumentException(string.Format("Enum value {0} doesn't exist.", shipmentType)); } }
The InvalidEnumArgumentException class is defined in the System.ComponentModel namespace.
The “true” in the TryParse function means that the check is case-insensitive, so even “air” or “land” are valid inputs.
Calling the function like…
SendShipment("air");
…will output the following:
This type is defined: Air
“mickeymouse” on the other hand will throw an exception:
Enum value mickeymouse doesn’t exist.
Note that the TryParse function can also be called with a stringified integer, as follows:
public void SendShipment(int numericShipmentType) { ShipmentOption shipmentOption; if (Enum.TryParse<ShipmentOption>(Convert.ToString(numericShipmentType), out shipmentOption)) { Console.WriteLine("This type is defined: {0}", (ShipmentOption)numericShipmentType); } else { throw new InvalidEnumArgumentException("ShipmentOption", numericShipmentType, typeof(ShipmentOption)); } }
However, TryParse will always return true in that case. If the integer can not be converted into a matching enumeration value then the enumeration will take on the integer value instead.
Example with a valid integer:
SendShipment(0);
This type is defined: Land
Example with an invalid integer:
SendShipment(8);
This type is defined: 8
View all various C# language feature related posts here.
Really handy tip. Thanks.