У меня есть это перечисление:
[Flags]
public enum ExportFormat
{
None = 0,
Csv = 1,
Tsv = 2,
Excel = 4,
All = Excel | Csv | Tsv
}
Я пытаюсь сделать обертку для этого (или любого, действительно) перечисления, которое уведомляет об изменениях. В настоящее время это выглядит так:
public class NotifyingEnum<T> : INotifyPropertyChanged
where T : struct
{
private T value;
public event PropertyChangedEventHandler PropertyChanged;
public NotifyingEnum()
{
if (!typeof (T).IsEnum)
throw new ArgumentException("Type T must be an Enum");
}
public T Value
{
get { return value; }
set
{
if (!Enum.IsDefined(typeof (T), value))
throw new ArgumentOutOfRangeException("value", value, "Value not defined in enum, " + typeof (T).Name);
if (!this.value.Equals(value))
{
this.value = value;
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs("Value"));
}
}
}
}
Поскольку перечисление действительно может быть назначено с любым значением, я хочу проверить, определено ли данное Значение. Но я нашел проблему. Если я приведу здесь перечисление, состоящее, например, из Csv | Excel
, то Enum.IsDefined
вернет false
. Очевидно, потому что я не определил ни одного перечисления, состоящего из этих двух. Я предполагаю, что на каком-то уровне это логично, но как мне тогда проверить, является ли данное значение допустимым? Другими словами, чтобы это работало, что мне нужно поменять эту следующую строку?
if (!Enum.IsDefined(typeof (T), value))