C#仿Oracle Decode,將ValueType對應成String

來源:互聯網
上載者:User
文章目錄
  • 使用範例
  • 程式說明
  •  
  • 測試案例
  • 參考資料

在寫Page,有時會有int、bool等等要轉成文字輸出,如: <%: item.Enable ? "啟用" : "停用" %>,用? : 處理雖然方便,但如果要轉換的String加上二個以上,就非常難處理,可是Page的這三個<%: %>、<%= %>、<%# %>語法,不能用if或switch,因為有用過Oracle,很喜歡它的Decode函式,所以我就自己寫一組Extension Method來處理。

 

使用範例
<%--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

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

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要對應成其他文字的需求,如果你有需要在自行修改吧。

 測試案例
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));}

 

原始碼下載

 

參考資料
  • Value Types (C# Reference)
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.