C#: Enum.IsDefined on combined flags
With flag-based enums, it's about having a bit set or not. So for 'ExportFormat', if bit 1 is set, it's CSV format, even though there might be more bits set. Is having bit 1 and 2 set an invalid value? This is subjective: from the point of view of the values as a group, it is invalid (there's no bitpattern defined for bits 1 and 2 set) however, as each value is a bit, looking at them individually, it can be that a value with bits 1 and 2 set is valid.
If one passes in the value 0011111011, is that a valid value? Well, it depends on what you're looking for: if you are looking at the whole value, then it's an invalid value, but if you're looking at individual bits, it's an ok value: it has bits set which aren't defined, but that's ok, as flag-based enums are checked 'per bit': you're not comparing them to a value, you're checking whether a bit is set or not.
So, as your logic will check on which bits are set to select which formats to pick, it's realy not necessary to check whether the enum value is defined: you have 3 formats: if the bit of the corresponding format is set, the format is selected. That's the logic you should write.
I would operate on the bit level and check if all bits set in the new value are set in your All
value:
if ( ! (All & NewValue) == NewValue )
You will have to see yourself how you best do that, maybe you need to cast all values to an int and then do the bitwise comparison.
We know that an enum value converted to a string will never start with a digit, but one that has an invalid value always will. Here's the simplest solution:
public static bool IsDefinedEx(this Enum yourEnum)
{
char firstDigit = yourEnum.ToString()[0];
if (Char.IsDigit(firstDigit) || firstDigit == '-') // Account for signed enums too..
return false;
return true;
}
Use that extension method instead of the stock IsDefined and that should solve your issue.