У меня есть это перечисление:
[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))