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