首页 > 编程语言 >【转载】将C#里的枚举Enum转换为int

【转载】将C#里的枚举Enum转换为int

时间:2023-03-06 14:58:18浏览次数:48  
标签:case return C# Enum int GetHashCode pValue CorElementType

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lzdidiv/article/details/71170528


将枚举类型转换为int在C#里非常简单,直接(int)强转就行了,可是这样写代码不方便,尤其让我这种懒癌患者难受,我喜欢用扩展方法的方式实现转换(如果不理解扩展方法请自行补课,这里不再介绍),比如这样string转int:

复制代码
public static class ExtendString
{
    public static int ToInt(this string s, int defaultValue = 0)
    {
        int i;
        return int.TryParse(s, out i) ? i : defaultValue;
    }
}
复制代码

 

比什么Convert或者Parse不知道高到哪里去了:

string str = "123";
int i = str.ToInt();

 

同样处理Enum行不行?

复制代码
public static class ExtendEnum
{
    public static int ToInt(this System.Enum e)
    {
        return (int)e;
    }
}
复制代码

 


很可惜Enum类型的实参可以强转为int,但是形参不行,编译器提示无法转换类型,非常令人无语。

不过用个object做中介就能强转了:

public static int ToInt(this System.Enum e)
{
    return (int)(object)e;
}

 

这时我们的枚举变量都可以调用ToInt()了,貌似一切都成功了。

身为本文作者的我敏锐的发现这种做法有个致命缺陷——装箱,它是代码性能骤降的一大元凶,我们要尽力避免它的存在。

先尝试改动转换方法:

public static int ToInt(this System.Enum e)
{
    return System.Convert.ToInt32(e);
}

 


结果发现e是以object类型被传参的,跟前一种做法相比没有本质区别。

思考良久我突然灵光一闪:任何对象都有 GetHashCode() 方法,用于返回该对象数据的Hash值,C#的常见内部类型都各自重载了该方法,比如int对象返回的Hash值就是它的数值本身,同为整型数据的Enum应该也返回它的数值才对。

为了防止搞出乌龙,那就查一下Enum类的源码吧,下面我把GetHashCode()的源码贴出来:

复制代码
[System.Security.SecuritySafeCritical]
public override unsafe int GetHashCode()
{
    // Avoid boxing by inlining GetValue()
    // return GetValue().GetHashCode();

    fixed (void* pValue = &JitHelpers.GetPinningHelper(this).m_data)
    {
        switch (InternalGetCorElementType())
        {
            case CorElementType.I1:
            return (*(sbyte*)pValue).GetHashCode();
            case CorElementType.U1:
            return (*(byte*)pValue).GetHashCode();
            case CorElementType.Boolean:
            return (*(bool*)pValue).GetHashCode();
            case CorElementType.I2:
            return (*(short*)pValue).GetHashCode();
            case CorElementType.U2:
            return (*(ushort*)pValue).GetHashCode();
            case CorElementType.Char:
            return (*(char*)pValue).GetHashCode();
            case CorElementType.I4:
            return (*(int*)pValue).GetHashCode();
            case CorElementType.U4:
            return (*(uint*)pValue).GetHashCode();
            case CorElementType.R4:
            return (*(float*)pValue).GetHashCode();
            case CorElementType.I8:
            return (*(long*)pValue).GetHashCode();
            case CorElementType.U8:
            return (*(ulong*)pValue).GetHashCode();
            case CorElementType.R8:
            return (*(double*)pValue).GetHashCode();
            case CorElementType.I:
            return (*(IntPtr*)pValue).GetHashCode();
            case CorElementType.U:
            return (*(UIntPtr*)pValue).GetHashCode();
            default:
            Contract.Assert(false, "Invalid primitive type");
            return 0;
        }
    }
}
复制代码

 


果然是强转为int后再GetHashCode(),等价于强转int

再看看最顶上的注释,我跟微软英雄所见略同啊哈哈

所以最后得到的代码为:

复制代码
public static class ExtendEnum
{
    public static int ToInt(this System.Enum e)
    {
        return e.GetHashCode();
    }
}
复制代码

 

转 https://www.cnblogs.com/maruko/p/11731681.html

标签:case,return,C#,Enum,int,GetHashCode,pValue,CorElementType
From: https://www.cnblogs.com/wl-blog/p/17183871.html

相关文章

  • 解决报错 TypeError: Cannot assign to read only property '0' of object '[object A
    constarray=[1,2,3];Object.freeze(array);letarray2=array;array2=array2.sort((a,b)=>b-a);某些库内部冻结了对象或者数组,导致直接去修改......
  • chrony时间同步服务
    一、Chrony介绍 Chrony是NTP(NetworkTimeProtocol,网络时间协议,服务器时间同步的一种协议)的另一种实现,与ntpd不同,它可以更快且更准确地同步系统时钟,最大程度的减少时......
  • kepware高级插件IOT Gateway_Rest Client和NodeRed实操
    1,安装Kepware软件,使用Iot高级插件需要有Java环境,下载地址为: https://www.oracle.com/文件名称为:jdk-7u79-windows-i5862,RestClient配置     ......
  • CentOS7.3中编译clangd
    CentOS7.3中编译clangd在CentOS7.3中进行C++的开发,使用VSCode的WSL模式,需要在CentOS中安装clangd,从GitHub官方发布版本下载的clangd是需要依赖GLIBC2.18的,这样就需要在Cen......
  • How DNS works comic All In One
    HowDNSworkscomicAllInOneDNS是如何工作的漫画/DNS的工作原理https://howdns.works/中文版https://howdns.works/zhhttps://howdns.works/zh-cnhttps:/......
  • npm audit fix --force
    npmauditfix--forcenpmauditfix没事别去执行这个命令,依赖关系搞坏了,有你好果子吃......
  • Mac上pnpm的安装与使用
    打开终端,执行npminstall--location=globalpnpm报错,没有访问权限,可使用如下操作解决:执行sudo-s然后再执行 npminstall--location=globalpnpm即可成功安装。......
  • 如何让 WinDebug Preview 加载 Dotnet Core 的 SOS.dll 进行调试
    一、前言最近我在使用WinDebug进行系统调试,也是在学习《Net高级调试》这本书。以前听过WinDebug调试器,但是没有使用过,由于最近想起来了,就好好的研究一下,学习一......
  • springboot集成nacos配置中心
    springboot版本2.6.7+nacos版本2.1.21、添加nacos依赖com.alibaba.bootnacos-config-spring-boot-starter0.2.122、配置application.propertiesnacos.config.boots......
  • 企业数据分析获得认可,瓴羊Quick BI通过中国信通院测评
    “互联网+”时代,企业数据分析成为了一种核心竞争力。在此背景下,瓴羊QuickBI等商业智能工具成为了不少企业提升内部企业数据分析的关键助手。现如今,面对海量的数据资产,一家......