gpt4 book ai didi

C#:Enum.IsDefined 在组合标志上

转载 作者:可可西里 更新时间:2023-11-01 07:51:57 24 4
gpt4 key购买 nike

我有这个枚举:

[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))

最佳答案

我们知道,转换为字符串的枚举值永远不会以数字开头,但具有无效值的值总是以数字开头。这是最简单的解决方案:

public static bool IsDefinedEx(this Enum yourEnum)
{
char firstDigit = yourEnum.ToString()[0];
if (Char.IsDigit(firstDigit) || firstDigit == '-') // Account for signed enums too..
return false;

return true;
}

使用该扩展方法代替常用的 IsDefined 应该可以解决您的问题。

关于C#:Enum.IsDefined 在组合标志上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/527486/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com