tengo esta enumeración:C#: Enum.IsDefined en las banderas combinadas
[Flags]
public enum ExportFormat
{
None = 0,
Csv = 1,
Tsv = 2,
Excel = 4,
All = Excel | Csv | Tsv
}
que estoy tratando de hacer un envoltorio en este (o cualquier, en realidad) de enumeración que notifica el cambio. Actualmente se parece a esto:
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"));
}
}
}
}
Desde una enumeración puede ser asignado con un valor de verdad, quiero comprobar si se ha definido el valor dado. Pero encontré un problema. Si aquí le doy una enumeración que consiste en, por ejemplo, Csv | Excel
, entonces Enum.IsDefined
devolverá false
. Aparentemente porque no he definido ninguna enumeración que consta de esos dos. Supongo que en algún nivel es lógico, pero ¿cómo debo verificar si el valor dado es válido? En otras palabras, para que funcione, ¿con qué necesito cambiar esta línea?
if (!Enum.IsDefined(typeof (T), value))
Vea mi extensión de Enum.IsDefined a continuación. –