2013年3月31日 星期日

使用typeof,GetType()搜尋類別中的方法與值

在記錄本章時,需複習關於建構類別的結構,才明白SHOW出的方法 或值是什麼 先簡單建立一個 超速類別判斷 類別CODE如下



public class Pass//叫PASS類好了
        {
            private int s;//宣告私用整數型態s 給 speed用來回傳速度的容器
            private string R="";//放字串
            public void Run()//執行判斷方法
            {
                if (s > 65)//此方法 取s值做判斷
                    R = "超速";// 判斷後將決定R的決定
                else
                    R = "沒超數";
            }
            public int speed//建立公用 整數型態
            {
                get//如果SPEED=輸入的數字 將回傳 s
                {
                    return s;//要回傳s
                }
                set
                {
                    if (value >= 0 && value <= 65)
                    {
                        s = value;//
                    }
                    else if (value > 66)
                    {
                        s = 66;//只要超過66 s值就是66了
                    }
                   
                }
            }
            public string RESULT//宣告公用類別回傳R用的
            {
                get
                {
                    Run();
                    return R;
                }
            }
        }



再來 我們做一個BUTTON模擬執行 是否成功吧!

BUTTON CODE如下



private void button3_Click(object sender, EventArgs e)
        {
            int a=120;
            Pass HW = new Pass();//HW是 PASS類
            HW.speed = a;//假如時數120KM 把值給 HW中的PASS
            HW.Run();// RUN方法 會依據SPEED的值做IF-ELSE判斷
            //最後再將 判斷結果傳回RESULT
            MessageBox.Show("目前時數"+a+"KM"+"超過"+HW.speed + "KM" + HW.RESULT);
        }
MESSAGEBOX SHOW出 目前時數120 超過66超速


再來是本章重點 用typeof來看看 PASS中有啥!


private void btn_Get_Click(object sender, EventArgs e)
        {
            Type type = typeof(Pass);//取得pass類型的Type物件
            foreach (MethodInfo method in type.GetMethods())//搜尋pass類別中
                                                            //定義的所有"公共"方法
                //指定給 method  型態為Methodinfo
            {
                rtbox_text.AppendText("方法名稱:" + method.Name + Environment.NewLine);//輸出方法名稱
                foreach (ParameterInfo parameter in method.GetParameters())//深度
                                                             //搜尋公共方法中所有參數
                {
                    rtbox_text.AppendText(
                        "  參數:" + parameter.Name + Environment.NewLine);//輸出參
                                                                          //數名稱
                }
            }
        }

再來 利用GetType() 取型態



private void button1_Click(object sender, EventArgs e)
        {
            string TR = "";//拿來裝搜尋結果
            foreach (Control c in Controls)//逐一搜尋控控制項
            /*關於controls為何可搜尋WINDOSFORM中的控制項
             *
             *Control 可以當做是控制項集合的父代。
             * 例如,將數個控制項加入 Form 時,
             * 每一個控制項都是指派給表單之
             * Controls 屬性的 Control.ControlCollection 成員
             * (衍生自 Control 類別)。
             * 來自於MSDN
             */
            {
                TR += c+"\n";
                if (c.GetType() == typeof(Label))
                {
                    ((Label)c).Text = "TT";
                    TR += "找到了" + c.GetType() + "修改Text插入TT" + "\n";
                }
                else
                {
                    TR+="不是你要的控制項LABLE"+"\n";
                }
                richTextBox1.Text = TR;//SHOW出來!
            }
        }

richtextbox輸出 如下

System.Windows.Forms.RichTextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.Label, Text: label1
找到了System.Windows.Forms.Label修改Text插入TT
System.Windows.Forms.Button, Text: 建構超數類別測試
不是你要的控制項LABLE
System.Windows.Forms.Button, Text: button2
不是你要的控制項LABLE
System.Windows.Forms.TextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.Button, Text: 搜尋
不是你要的控制項LABLE
System.Windows.Forms.TextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.RichTextBox, Text:
不是你要的控制項LABLE
System.Windows.Forms.Button, Text: 取得
不是你要的控制項LABLE

此時 FROM上的LABLE 變成 TT
相當好用 可以搜尋 又可以 改變他

沒有留言:

張貼留言