星期五, 3月 25, 2016

[C#] OfType()、Cast()

之前在撰寫 WinForm 篩選控件時,很自然都會使用 OfType() 來做,一直都是把它當成 WHERE 來看待,閱讀 極意之道次世代 .NET Framework 3.5資料庫開發聖典 才發現到其內部運作模式
  • OfType() 和 Cast() 都是針對集合元素來進行轉型
  • OfType:利用 [as] 運算子進行轉型,轉型失敗就忽略該元素
  • Cast():利用 Convert.ChangeType() 進行轉型,轉型失敗拋出 InValidCast Exception

簡單範例

在 WinForm 內放置一個 Panel,並在 Panel 內放不同的控件,利用 OfType()、Cast() 來篩選 Panel 內 TextBox 控件

[C#] OfType()、Cast()-1

namespace LINQ_OfType_Cast
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnOfType_Click(object sender, EventArgs e)
        {
            string CtlNames = string.Empty;
            foreach (TextBox txt in panel1.Controls.OfType<TextBox>())
            {
                CtlNames += txt.Name + Environment.NewLine;
            }
            MessageBox.Show(CtlNames , "OfType() 結果" , MessageBoxButtons.OK , MessageBoxIcon.Information);
        }

        private void btnCast_Click(object sender, EventArgs e)
        {
           // 預期會丟出 InvlidCastException
           foreach (TextBox txt in panel1.Controls.Cast<TextBox>())
           {
 
           }
        }
    }
}
OfType() 結果

[C#] OfType()、Cast()-2

Cast() 結果

[C#] OfType()、Cast()-3

這樣更清楚使用 OfType()、Cast() 使用時機

沒有留言:

張貼留言