c# - 值是枚举和 -1 吗?

标签 c# .net enums

对于 View 模型验证,我需要确定一个值(我只有一个对象接口(interface))是否为枚举且数值为 -1。

我试过这个:

// object value;
if (value?.GetType().IsEnum == true && (int)value == -1) return null;

它应该可以与我的主要基于 int 的模型枚举一起使用。

但是当值是基于 byteVisibility 枚举(恰好也在 View 模型类中并且应该被忽略以进行验证)时它会失败而不是 int,这似乎不能转换为 int。我可以做更多的测试,但不会太慢。

是否有一个很好的简单解决方案?也许是 Enum 类中的一些测试方法之类的?

最佳答案

您可以使用 GetEnumUnderlyingType() 检查底层类型:

Type t = value?.GetType();
if (t?.IsEnum == true && 
    t?.GetEnumUnderlyingType() == typeof(int) && 
    (int)value == -1)
    return null;

因为 byte 永远不可能是 -1,所以你不需要检查它。但是您可能还需要扩展对 long 枚举的检查。


更新:

我只是稍微尝试了一下,发现 Convert.ToInt32() 也可以解决您的问题:

if (value?.GetType().IsEnum == true && 
    Convert.ToInt64(value) == -1)
    return null;

这看起来更简洁,也适用于所有可能的底层类型。


另一个更新:不幸的是,上面的解决方案并不像我想象的那么干净。即使使用 Convert.ToInt64() 解决了 long 值对于 Int32 来说太大的问题,但是如果你传递一个 它就会抛出>ulong.MaxValue.

所以你必须选择一个足够大的类型来容纳所有可能的枚举基类型:

if (value?.GetType().IsEnum == true && 
    Convert.ToDecimal(value) == -1)
    return null;

使用 Convert.ToDecimal() 这会通过到目前为止出现的所有测试用例。

关于c# - 值是枚举和 -1 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42692024/

相关文章:

c# - 需要 xpath 表达式来循环通过 xmldocument

c# - 设置人工​​内存限制

java - 如何在 JNA 中映射枚举

java - 制作一个列表并将其初始化以包含枚举的所有值

c++ - 声明变量时使用 ": number"

c# - 关于引用类型的问题

c# - 有没有办法检查 RDP 连接是否可用?

c# - '&' 与 '&&' 的用法

.net - .net 框架在阻塞调用期间做什么?

c# - ServerVersion = 'conn.ServerVersion' 抛出类型为 'System.InvalidOperationException' 的异常