Enum.GetHashCode()的问题
先说一下,正常如果代码可以定义成枚举,我是比较倾向于定义成枚举的,类似这样:
public enum Gender
{
/// <summary>
/// 男
/// </summary>
[Description("男")]
Male = 1,
/// <summary>
/// 女
/// </summary>
[Description("女")]
Female = 2,
/// <summary>
/// 其他
/// </summary>
[Description("其他")]
Other = 3
}
那么,通常,在代码中(例如linq),我倾向于用Enum来强制转为其他类型,这样如果我要增加一个枚举或者修改一个枚举的名字,那么我很容易查到有多少需要修改的地方,所以我对于那种“定义了枚举,却在用的时候写死的,诸如p.Gender=1这类的”代码是很痛恨的,因为如果需要修改,你不知道有多少地方需要修改,所以一般我的用法是:如果需要int,那就
(int)Gender.Male;
这样子用,需要修改的时候,只要改了枚举定义,然后alt+shift+F10即可。。。
说明一下,我们项目里面用的EF+MySQL,MySQL里面的类型定义成了INT(4),这样的话,到了Entity里面映射成的是sbyte类型,那么我们的代码就写成了这样:
public enum Status : sbyte
{
/// <summary>
/// 正常
/// </summary>
[Description("正常")]
Normal = 1,
/// <summary>
/// 冻结
/// </summary>
[Description("冻结")]
Frozen = 2
}
继承自sbyte
在这里说明一下,我们这里用到一个叫QueryBuilder的东西,所以需要加linq查询的条件的时候是这样的:
deviceCondition.Equals(d => d.Status, ((sbyte)Status.Normal).ToString());
但是最初我用的时候不是这样的,当时可能脑子抽了,为了不强制转换,我写成了这样:
deviceCondition.Equals(d => d.Status, Status.Normal.GetHashCode().ToString());
看到了什么区别么?就是GetHashCode(),我在用之前甚至在另外的地方验证了一下,确认Gender.Male.GetHashCode().ToString()返回的是1,是我要的结果,但是等到MySQL查询不出来数据,让我一直以为是那个QueryBuilder的In条件筛选针对DateTime类型的问题,后来才发现,Status.Normal.GetHashCode().ToString()返回的并不是我要的1,而是一个四位的数字的时候,我意识到不是QueryBuilder的问题了。
原来,如果你的Enum没有继承自sbyte的时候,或者继承自Int的时候是没有问题的(Enum默认继承自Int?),但是,当继承自其他类型的时候,就不一定了。。。
最后,以后还是强制转换吧,既可以在编码的时候就暴露出错误,也方便在修改的时候,把用到的地方一次全部修改。。。
Enum.GetHashCode()的问题的更多相关文章
- 慎用 Enum.GetHashCode()
公司里遗留下了相当多的 Enum.GetHashCode()来获取枚举值的代码 但是这会产生装箱行为的!!因为Enum是值类型,GetHashCode()是Object的方法,调用GetHashCod ...
- unity踩坑2020-01-21
这几天一直在测试一个类似于传奇的2d界面游戏,目前做的测试为: 人物动作响应,主要是8方向的判断和资源文件精灵的刷新. 学到的知识点: 1,Enum.GetHashCode() 可以得到这个枚举的索引 ...
- enum操作--获取枚举里的最大值
一个应用系统,如果程序里没有任何enum的使用,我认为它的可读性是有待商榷的. 求枚举里的最大/最小枚举值, 其实是对Array进行操作: enum EnumTest { ddd = , eee } ...
- C# EnumHelper Enum的值,Description,ToString()的相互转换
首先定义枚举类型,如下: /// <summary> /// 板块 /// </summary> public enum Plate { [Descriptio ...
- MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动
MVC图片上传详解 MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...
- C#中正确使用enum做Key的姿势
C#中自定义enum,然后将其作为Dictionary的Key,通常的做法如下: using System; using System.Text; using System.Collections.G ...
- Enum枚举类使用集合
1.使用扩展方法使用枚举值对于的Description属性值 public static class EnumExtenstion { public static string GetDescript ...
- C# 中 枚举Enum 一些转换的方法整理
工作中 经常遇到枚举 的一些转换 特别是获取枚举备注等 特地整理下 方法以后使用 public void TestMethod1() { TestEnumOne colorEnum = TestE ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
随机推荐
- Unity3d之个性化鼠标
代码实例: using UnityEngine; using System.Collections; public class CursorController : MonoBehaviour { / ...
- 【转】Memcached安装
解析:Memcached是什么? Memcached是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度. 一.软件版本 ...
- linux -a 到 -z 的意义
shell if判断中常用的也就是绿色部分,尾部部分越看越不懂.从百度文库转载. [ -a FILE ] 如果 FILE 存在则为真. [ -b FILE ] 如果 FILE 存在且是一个块特殊文件则 ...
- GoldenGate针对OEM 13.1的版本发布
OGG 针对OEM(Oracle Enterprise Manager) 13.1的插件已经可以从这里下载: http://www.oracle.com/technetwork/middleware/ ...
- MySQL 通过semi join 优化子查询
半连接是MySQL 5.6.5引入的,多在子查询exists中使用,对外部row source的每个键值,查找到内部row source匹配的第一个键值后就返回,如果找到就不用再查找内部row sou ...
- Java IO流
File类 ·java.io.File类:文件和目录路径名的抽象表示形式,与平台无关 ·File能新建.删除.重命名文件和目录,但File不能访问文件内容本身.如果需要访问文件内容本身,则需要使用输入 ...
- 安卓性能测试工具-GT,安测试
GT: 是腾讯出品的一款APP的随身调测平台,它是直接运行在手机上的“集成调测环境”(IDTE, Integrated Debug&Test Environment).利用GT,仅凭一部 ...
- SQL 基本知识
四个基础语法 1. insert into 表名 (列名) [values] 值列表 insert into 表名 values 值列表 [扩展]插入多行: 1. insert into <表名 ...
- LayaAir引擎——(七)
LayaAir引擎——人物控制TiledMap地图移动和墙壁检测 所需要的软件: LayaAir IDE 1.0.2版本 TiledMap 所需要的东西: 地图:53 * 32,(48*48) 人物: ...
- caffe 基本知识简介
很多不错的网页: 1.http://alanse7en.github.io/caffedai-ma-jie-xi-1/ 主要介绍基本caffe知识 interace 接口 API中的‘I’ Caffe ...