Let's say I have this:
PriorityType? priority;
string userInput = ...;
I cannot change how this is defined: PriorityType? priority because it's actually part of a contract with another piece of code.
I tried this, but it does not work:
if (Enum.TryParse<PriorityType?>(userInput, out priority)) {
What is the correct way?
The simplest way:
PriorityType tempPriority;
PriorityType? priority;
if (Enum.TryParse<PriorityType>(userInput, out tempPriority))
    priority = tempPriority;
This is the best I can come up with:
public static class NullableEnum
{
    public static bool TryParse<T>(string value, out T? result) where T :struct, IConvertible
    {
        if (!typeof(T).IsEnum)
            throw new Exception("This method is only for Enums");
        T tempResult = default(T);
        if (Enum.TryParse<T>(value, out tempResult))
        {
            result = tempResult;
            return true;
        }
        result = null;
        return false;
    }
}
Use:
if (NullableEnum.TryParse<PriorityType>(userInput, out priority))
The above class can be used just like Enum.TryParse except with a nullable input. You could add another overloaded function that takes a non-nullable T so that you could use it in both instances if you want. Unfortunately extension methods don't work very well on enum types (as far as I could try to manipulate it in the short time I tried).
If you want it to be a single line of code, you can do it like this:
var priority = Enum.TryParse<PriorityType>(userInput, out var outPriority) ? outPriority : (PriorityType?) null;
                        This is the same solution posted by Ron Beyer with a little refactoring:
 public static class NullableEnum
{
    public static bool TryParse<T>(string value, out T? result) where T : struct, IConvertible
    {
        if (!typeof(T).IsEnum) throw new ArgumentException("Invalid Enum");
        result = Enum.TryParse(value, out T tempResult) ? tempResult : default(T?);
        return (result == null) ? false : true;
    }
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With