在寫Page,有時會有int、bool等等要轉成文字輸出,如: <%: item.Enable ? "啟用" : "停用" %>,用? : 處理雖然方便,但如果要轉換的String加上二個以上,就非常難處理,可是Page的這三個<%: %>、<%= %>、<%# %>語法,不能用if或switch,因為有用過Oracle,很喜歡它的Decode函式,所以我就自己寫一組Extension Method來處理。
使用範例
1 2 3 4 5 6 7 8 | <%--item.State的Type是 int --%> <%: item.State.Decode( "未知" , "無法使用" , "等待執行" , "就緒" , "執行中" ) %> <%--item.Enable的Type是 bool ?--%> <%: item.Enable.Decode( "停用" , "啟用" , "未設定" ) %> <%--item.Enable的Type是 int ,但值不連續--%> <%: item.State.Decode( new Dictionary< int , string > {{100, "處理中" }, {200, "成功" }, {300, "失敗" } })%> |
程式說明
我的Extension Method對像是用ValueType,為什麼用ValueType呢?,因為ValueType是bool、int、long、float甚至enum的基類(也就是C#中的struct),這樣就有多型的效果,程式也可以少寫一點,然後我也有寫Nullable的對應,當是null時會對應到預設Meaage,又因為值可能是不連續的,如:100、200、300,不是0、1、2,所以總共有四個多載。
如果值是連續的可以使用這二個Method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public static string Decode( this ValueType value, params string [] messages) { //大部分的ValueType都可以轉成int int key = Convert.ToInt32(value); //不在Array範圍中的用最後一個Message if (key >= messages.Length || key < 0) { return messages.LastOrDefault(); } return messages[key]; } public static string Decode<T>( this Nullable<T> value, params string [] messages) where T : struct { if (value.HasValue) { return Decode(value.Value, messages); } else { //沒有值就用最後一個Message return messages.LastOrDefault(); } } |
如果值不是連續的可以使用這二個Method
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | public static string Decode( this ValueType value, IDictionary< int , string > messages, string defaultMessage = null ) { //大部分的ValueType都可以轉成int int key = Convert.ToInt32(value); //判斷有沒有Key if (messages.ContainsKey(key)) { return messages[key]; } else { //有預設message用預設message,沒預設message用最後一個message if (defaultMessage == null ) { return messages.Values.LastOrDefault(); } else { return defaultMessage; } } } public static string Decode<T>( this Nullable<T> value, IDictionary< int , string > messages, string defaultMessage = null ) where T : struct { if (value.HasValue) { return Decode(value.Value, messages); } else { //沒有值就用最後一個Message if (defaultMessage == null ) { return messages.Values.LastOrDefault(); } else { return defaultMessage; } } } |
NOTE:
我有想過把不連續的Method,this的Type改成object,讓所有object都可以使用,不過我剛好都沒有像A、B、C要對應成其他文字的需求,如果你有需要在自行修改吧。
測試案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | enum TestEnum { AA, BB, CC, DD } [TestMethod, Owner( "Wade" )] public void U__DecodeExtension_Decode() { var defaultMessage = "Test" ; var message1 = new string [] { "A" , "B" , "C" , "D" }; var message2 = new Dictionary< int , string > { { 10, "A" }, { 20, "B" }, { 30, "C" }, { 40, "D" } }; Assert.AreEqual( "B" , true .Decode(message1)); Assert.AreEqual( "A" , false .Decode(message1)); Assert.AreEqual( "A" , 0.Decode(message1)); Assert.AreEqual( "B" , 1.Decode(message1)); Assert.AreEqual( "D" , 4.Decode(message1)); Assert.AreEqual( "D" , (-1).Decode(message1)); Assert.AreEqual( "B" , (( byte )1).Decode(message1)); Assert.AreEqual( "D" , 10.Decode(message1)); Assert.AreEqual( "D" , (10f).Decode(message1)); Assert.AreEqual( "B" , (1L).Decode(message1)); Assert.AreEqual( "A" , (0L).Decode(message1)); Assert.AreEqual( "A" , TestEnum.AA.Decode(message1)); Assert.AreEqual( "B" , TestEnum.BB.Decode(message1)); Assert.AreEqual( "D" , true .Decode(message2)); Assert.AreEqual( "D" , false .Decode(message2)); Assert.AreEqual( "A" , 10.Decode(message2)); Assert.AreEqual( "B" , 20.Decode(message2)); Assert.AreEqual( "D" , 40.Decode(message2)); Assert.AreEqual( "D" , (-1).Decode(message2)); Assert.AreEqual( "A" , (10f).Decode(message2)); Assert.AreEqual( "Test" , true .Decode(message2, defaultMessage)); Assert.AreEqual( "Test" , false .Decode(message2, defaultMessage)); Assert.AreEqual( "A" , 10.Decode(message2, defaultMessage)); Assert.AreEqual( "B" , 20.Decode(message2, defaultMessage)); Assert.AreEqual( "D" , 40.Decode(message2, defaultMessage)); Assert.AreEqual( "Test" , (-1).Decode(message2, defaultMessage)); Assert.AreEqual( "A" , (( byte )10).Decode(message2, defaultMessage)); Assert.AreEqual( "A" , (10f).Decode(message2, defaultMessage)); Assert.AreEqual( "D" , ( new Nullable< int >()).Decode(message1)); Assert.AreEqual( "A" , ( new Nullable< int >(0)).Decode(message1)); Assert.AreEqual( "D" , ( new Nullable< bool >()).Decode(message1)); Assert.AreEqual( "B" , ( new Nullable< bool >( true )).Decode(message1)); Assert.AreEqual( "D" , ( new Nullable< int >()).Decode(message2)); Assert.AreEqual( "A" , ( new Nullable< int >(10)).Decode(message2)); Assert.AreEqual( "D" , ( new Nullable< int >(40)).Decode(message2)); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?