惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Help Net Security
Help Net Security
G
Google Developers Blog
雷峰网
雷峰网
WordPress大学
WordPress大学
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Engineering at Meta
Engineering at Meta
Security Latest
Security Latest
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
F
Full Disclosure
C
Cybersecurity and Infrastructure Security Agency CISA
T
The Exploit Database - CXSecurity.com
J
Java Code Geeks
U
Unit 42
C
Cyber Attacks, Cyber Crime and Cyber Security
V
V2EX
C
Cisco Blogs
博客园 - 司徒正美
Project Zero
Project Zero
L
LINUX DO - 热门话题
阮一峰的网络日志
阮一峰的网络日志
Blog — PlanetScale
Blog — PlanetScale
Scott Helme
Scott Helme
A
About on SuperTechFans
Hugging Face - Blog
Hugging Face - Blog
S
Securelist
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
G
GRAHAM CLULEY
酷 壳 – CoolShell
酷 壳 – CoolShell
Cyberwarzone
Cyberwarzone
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 叶小钗
T
Threatpost
Recorded Future
Recorded Future
C
CXSECURITY Database RSS Feed - CXSecurity.com
宝玉的分享
宝玉的分享
N
News and Events Feed by Topic
人人都是产品经理
人人都是产品经理
The Register - Security
The Register - Security
S
Security Archives - TechRepublic
博客园 - Franky
N
News | PayPal Newsroom
Simon Willison's Weblog
Simon Willison's Weblog
S
SegmentFault 最新的问题
W
WeLiveSecurity
A
Arctic Wolf
B
Blog

博客园 - 黃偉榮

Web Project的檔案共用小技巧 IoC的中繼器:CommonServiceLocator UTF8Encoding與BOM Temporary Post Used For Theme Detection (d4b0aefa-c88e-4957-bba7-b367d1bfa042 - 3bfe001a-32de-4114-a6b4-4005b770f6d7) 寫CodedUI時如何尋找控制項的小技巧 Visual Studio 2010 Feature Packs 2之Silverlight自動化測試 Moles - Isolation framework for .NET(假.Net)介紹 [小技巧]Entity Framework強型別Include Visual Studio 單元測試的3種Initialize與Cleanup jQuery套件-檢查頁面的欄位是否有變更 用EventLogReader查詢特殊EventLog jQuery自製Plugin-Bind事件函式時檢查有沒有Bind過 ASP.NET MVC TempData使用心得 Visual Stuiod 自訂檔案比較合并工具 [小技巧]自動化測試時NLog的訊息輸出到測試結果中 小技巧:專案切換32與64位元組件 Linq小技巧:日期處理 Unit Test小技巧 : DateTime的Stub 解決TFS Build Asp.Net Mvc開啟MvcBuildViews後無法載入組件問題
C#仿Oracle Decode,將ValueType對應成String - 黃偉榮 - 博客园
黃偉榮 · 2010-10-20 · via 博客园 - 黃偉榮

在寫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));

}

原始碼下載

參考資料