检查未知枚举是否有默认值

问题描述 投票:0回答:4

我有一些枚举,第一个枚举的名称为“默认”。
现在我有一个函数,我只获取一个对象作为参数,那么如何检查该对象是否设置为枚举的第一个条目?
我只知道如何检查它是否是一个枚举,但不知道它有什么值。

c# enums
4个回答
2
投票

这样的事情会帮助我猜测

public static bool IsFirstEnum<T>(T enumVal) where T: System.Enum
{
    return enumVal.Equals(default(T));
}

PS:请记住,默认 Enum 元素首先使用最低标志(最好是 0)定义 Ref

例如:

enum Day {Sat, Sun, Mon, Tue, Wed, Thu, Fri};
,其中周六是默认值
例如:
enum Day {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};
其中 Sat 是默认值
例如:
enum Day {Sat=1, Sun=0, Mon, Tue, Wed, Thu, Fri};
,其中 Sun 又是默认值

如果您打算使用“Defaul”关键字,那么

public static bool IsDefaultEnum<T>(T enumVal) where T: System.Enum
{ 
    var val = typeof(T).GetField("Default").GetValue(enumVal);
    return val.Equals(enumVal);
}

2
投票

如果所有这些默认值都为零(这是常态),那么您可以直接转换为

int
并与零进行比较。对于给定的枚举类型,这也与
default
相同。

如果没有,并且您想使用名称

"Default"
作为决定特征,那么您可以使用。

Enum.Parse(typeof(MyEnum), "Default")

返回一个等于

MyEnum.Default
的对象等等。

要获取第一个定义值,您需要使用:

typeof(MyEnum).GetFields(BindingFlags.Static | BindingFlags.Public).First().GetValue(null);

我不确定是否保证第一个定义的值仍按顺序保持在第一个,但目前是这样工作的。


0
投票

下面的扩展方法在我看来更令人满意,因为它不需要反射。

public static bool IsDefaultEnumValue<TEnum>(TEnum value) where TEnum : struct, Enum
{
    return EqualityComparer<TEnum>.Default.Equals(value, default);
}

-2
投票

您可以将 int 值转换为 Enum 值(以及相反),默认 Enum 值始终为 0。

您可以通过检查其 int 值来检查返回的枚举是否为默认值:

if((int)EnumVal == 0)
{return "Enum is default";}

相反,您可以通过相反的方式检查默认值:

    EnumName default = (EnumName)0;
© www.soinside.com 2019 - 2024. All rights reserved.