我有这个枚举:
[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))