对于 View 模型验证,我需要确定一个值(我只有一个对象接口(interface))是否为枚举且数值为 -1。
我试过这个:
// object value;
if (value?.GetType().IsEnum == true && (int)value == -1) return null;
它应该可以与我的主要基于 int
的模型枚举一起使用。
但是当值是基于 byte
的 Visibility
枚举(恰好也在 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/