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.