將列舉型別轉換為int在c#裡非常簡單,直接(int)強轉就行了,可是這樣寫**不方便,尤其讓我這種懶癌患者難受,我喜歡用擴充套件方法的方式實現轉換(如果不理解擴充套件方法請自行補課,這裡不再介紹),比如這樣string轉int:
public static class extendstring
}比什麼convert或者parse不知道高到**去了:
string str = "123";
int i = str.toint();
同樣處理enum行不行?
public static class extendenum
}很可惜enum型別的實參可以強轉為int,但是形參不行,編譯器提示無法轉換型別,非常令人無語。
不過用個object做中介就能強轉了:
public static int toint(this system.enum e)
這時我們的列舉變數都可以呼叫toint()了,貌似一切都成功了。
身為本文作者的我敏銳的發現這種做法有個致命缺陷——裝箱,它是**效能驟降的一大元凶,我們要盡力避免它的存在。
先嘗試改動轉換方法:
public static int toint(this system.enum e)
結果發現e是以object型別被傳參的,跟前一種做法相比沒有本質區別。
思考良久我突然靈光一閃:任何物件都有 gethashcode() 方法,用於返回該物件資料的hash值,c#的常見內部型別都各自過載了該方法,比如int物件返回的hash值就是它的數值本身,同為整型資料的enum應該也返回它的數值才對。
為了防止搞出烏龍,那就查一下enum類的原始碼吧,下面我把gethashcode()的原始碼貼出來:
[system.security.securitysafecritical]
public override unsafe int gethashcode()}}
果然是強轉為int後再gethashcode(),等價於強轉int
再看看最頂上的注釋,我跟微軟英雄所見略同啊哈哈
所以最後得到的**為:
一種將列舉Enum轉換為JSON物件的方法
public enum actionstatus public string getstatus public int getcode 經測試,無論是jsonproperty還是jsongetter都不能解決此問題,輸出依舊為列舉的名稱,而在列舉中,預設的tostring方法是不能覆蓋的,想來想去,...
c 如何自動將強型別列舉轉換為int?
直接看如下 include struct a enum classb intfoo int input intmain a local a是強型別列舉試圖實現的功能,但是有乙個小的區別 普通列舉可以轉換為整數型別,而強型別列舉不能在沒有強制轉換的情況下實現。因此,有沒有辦法將強型別的列舉值轉換為整數...
C的enum與Delphi中列舉的轉換問題
當delphi呼叫乙個來自c的介面時,比如dll。c中的函式引數可能是列舉型別,由於delphi預設列舉長度為2位元組 c為4位元組,則將會在呼叫時產生意外,因此需要解決該問題 delphi中的列舉定義示例如下,這裡以對接openssl的point conversion form t型別為例 typ...