检查整数类型是否属于枚举成员

Ale*_*alt 28 c#

我想检查一些整数类型属于(一个)枚举成员.

例如,

public enum Enum1
{
    member1 = 4,

    member2 = 5,

    member3 = 9,

    member4 = 0
}
Run Code Online (Sandbox Code Playgroud)

Enum1 e1 =(Enum1)4给我member1

Enum1 e2 =(Enum1)10没有给我什么,我想检查一下.

Sam*_*eff 58

使用 Enum.IsDefined

Enum.IsDefined(typeof(Enum1), 4) == true
Run Code Online (Sandbox Code Playgroud)

Enum.IsDefined(typeof(Enum1), 1) == false
Run Code Online (Sandbox Code Playgroud)

  • 我很抱歉,如果我在某些特定情况下警告OP关于你的方法可能缓慢**,以某种方式冒犯了你**.我同意你的回答!然而,高效编码*有时*需要写几行:并非所有内容都可以在一次调用中完成;)如果OP不需要非常高的性能并且更喜欢代码简单,那么您的解决方案就是完美**.这就是我在第三次评论中所说的.我自己经常使用`Enum.IsDefined`方法,但在某些特定情况下我不会这样做.无论如何,OP接受了你的答案(我甚至赞成了它)所以......;) (9认同)
  • 首先,微优化是编程工作的浪费.其次,`Enum.IsDefined`每毫秒运行2000次以上.我不会认为这很慢. (8认同)
  • 如果你需要速度,请不要使用它:Enum.IsDefined使用Reflection并且**非常慢. (7认同)
  • @Sam:我预先确定*"如果你需要速度"*.如果你在例如网络帧处理循环中执行此操作,最终可能会得到可怕的结果.@Alexander Stalt:除非你逐一检查每个值,否则你无法想象.但这太过分了(就代码长度而言).真正的问题是:真的需要这样的测试吗?通常,处理所有可能值的switch语句和*"default"*one就足够了.但是我们显然缺乏在这里讨论的信息(这可能是偏离主题的) (2认同)

Jon*_*eet 5

正如Sam所说,您可以使用IsDefined。不过这有点尴尬。您可能想看一下我的不受限制的旋律库,它使您可以:

Enum1 e2 = (Enum1)10;
if (e2.IsNamedValue()) // Will return false
{
}
Run Code Online (Sandbox Code Playgroud)

一个枚举调用可能不值得,但是如果您用枚举做很多事情,您可能会在其中找到一些有用的东西。

它应该比Enum.IsDefinedbtw 更快。它目前仅执行线性扫描,但请告知我是否需要改进:)(大多数枚举都足够小,以至于它们可能不会从中受益HashSet,但我们可以进行二进制搜索...)