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& ...
随机推荐
- 当在浏览器输入一个url访问后发生了什么
首先根据DNS获取该url的ip地址,ip地址的获取可能通过本地缓存,路由缓存等得到. 然后在网络层通过路由选择查找一条可达路径,最后利用tcp/ip协议来进行数据的传输. 其中在传输层将信息添加源端 ...
- python tips(持续更新)
1. 引用上一层目录 import syssys.path.append('..')import xx 2. python json JSON是一种轻量级的数据交换格式.可以解决数据库中文存储问题,对 ...
- ios系统crash文件分析
分析crash文件必备条件:crash文件的uuid,app的uuid,dsym文件的uuid必须一致 1> crash文件的uuid为Binary Images:0x4000 - 0x1173 ...
- mac brew mysql 启动之后报错
打开电脑 链接mysql 发现报错,连不上,应该是没自启动, 之前一直用windows电脑,就用mysql start 准备启动下,发现报错, p.p1 { margin: 0.0px 0.0px 0 ...
- 清华微积分-1_Ch1习题
U3-1 Here are some sets: (1) R both and (2) ∅ both and (3) (1,+∞) open set (4) [−1,0] closed set, - ...
- Scala的下一步
第七步:带类型的参数化数组 Scala里可以使用new实例化对象或类实例.当你在Scala里实例化对象,可以使用值和类型把它参数化:parameterize.参数化的意思是在你创建实例的时候“设置”它 ...
- people have been arrested under other offences instead.
Homosexuality is not explicitly banned in Egypt but gay people have been arrested under other offenc ...
- aspx在页面跳转(Response.Redirect)时丢失session问题及解决办法
[问题描述] 假设a.aspx.cs页面保存有Session["empid"]="3",当a.aspx.cs通过Response.Redirect(" ...
- iOS---XMPP环境搭建过程
什么是即时通信? 即时通信是目前Internet上最为流行的通讯方式, 各种各样的即时通讯软件也层出不穷, 服务提供商也提供了越来越枫木的通讯服务功能. 即时通讯有多重实现方式, XMPP就是其中一种 ...
- Java HttpGet
String urlStr ="https://qyapi.weixin.qq.com/cgi-bin/gettoken?a=a&b=b"; URL url = null; ...