c# 反射

來源:互聯網
上載者:User

標籤:

反射的用途:    (1)使用Assembly定義和載入程式集,載入在資訊清單中列出模組,以及從此程式集中尋找類型並建立該類型的執行個體。     (2)使用Module瞭解包含模組的程式集以及模組中的類等,還可以擷取在模組上定義的所有全域方法或其他特定的非全域方法。     (3)使用ConstructorInfo瞭解建構函式的名稱、參數、存取修飾詞(如pulic 或private)和實現詳細資料(如abstract或virtual)等。     (4)使用MethodInfo瞭解方法的名稱、傳回型別、參數、存取修飾詞(如pulic 或private)和實現詳細資料(如abstract或virtual)等。    (5)使用FiedInfo瞭解欄位的名稱、存取修飾詞(如public或private)和實現詳細資料(如static)等,並擷取或設定欄位值。    (6)使用EventInfo瞭解事件的名稱、事件處理常式資料類型、自訂屬性、宣告類型和反射類型等,添加或移除事件處理常式。     (7)使用PropertyInfo瞭解屬性的名稱、資料類型、宣告類型、反射類型和唯讀或可寫狀態等,擷取或設定屬性值。     (8)使用ParameterInfo瞭解參數的名稱、資料類型、是輸入參數還是輸出參數,以及參數在方法簽名中的位置等。為群中一大神寫得demo我在項目中用到的方法如下/// <summary>        /// 得到類比故障方法        /// </summary>        /// <param name="className"></param>        public void GetFaultFun(string className)        {            var assembly = Assembly.Load("FaultDll").CreateInstance(className, true);            var methods = assembly.GetType().GetMethods();            methodlist.Clear();            foreach (MethodInfo m in methods)            {                if (m.Name != "ToString" && m.Name != "GetHashCode" && m.Name != "GetType" && m.Name != "Equals" && m.IsPublic)                {                    System.Windows.Controls.RadioButton radio = new System.Windows.Controls.RadioButton();                    radio.Name = m.Name;                    radio.Content = m.Name;                    radio.IsChecked = false;                    radio.Click += radio_Click;                    radio.Margin = new Thickness(10, 5, 0, 0);                    this.function.Children.Add(radio);                    methodlist.Add(m);                }            }        }
/// <summary>        /// 得到方法參數        /// </summary>        /// <param name="funName"></param>        public void GetParameters(string funName)        {            foreach (MethodInfo m in methodlist)            {                if (m.Name == funName)                {                    for (int i = 8; i < m.GetParameters().Count(); i++)                    {                        var p = m.GetParameters()[i];                        StackPanel panel = new StackPanel();                        panel.Name = p.Name;                        panel.Orientation = System.Windows.Controls.Orientation.Horizontal;                        panel.Margin = new Thickness(10, 5, 0, 0);                        TextBlock tb = new TextBlock();                        tb.Margin = new Thickness(10, 0, 0, 0);                        tb.Text = p.Name + ":";                        System.Windows.Controls.TextBox tbx = new System.Windows.Controls.TextBox();                        tbx.Width = 40;                        tbx.Margin = new Thickness(10, 0, 0, 0);                        panel.Children.Add(tb);                        panel.Children.Add(tbx);                        this.parameters.Children.Add(panel);                    }                }            }        }
/// <summary>        /// 調用dll函數        /// </summary>        /// <param name="fun"></param>        public void InvokeFunc(string fun)        {            try            {                ArrayList list = GetParamsArray();                Type[] types = Assembly.Load("FaultDll").GetTypes();//LoadFile                foreach (Type t in types)                {                    MethodInfo m = t.GetMethod(fun);                    if (m != null)                    {                        object o = Activator.CreateInstance(t);                        object[] invokeArgs = new Object[] { resultmapA, resultmapB,bytedatas, startPositionA, endPositionA, startPositionB, endPositionB,list,null,null };                        m.Invoke(o, invokeArgs);                        resultmapA = invokeArgs[0] as Bitmap;//ref參數                        resultmapB = invokeArgs[1] as Bitmap;                        bytedatas = invokeArgs[2] as byte[];                    }                }            }            catch (Exception ex)            {                System.Windows.MessageBox.Show(ex.Message);            }        }
  反射用到的主要類:    System.Type 類--通過這個類可以訪問任何給定資料類型的資訊。
    System.Reflection.Assembly類--它可以用於訪問給定程式集的資訊,或者把這個程式集載入到程式中。
System.Type類:
    System.Type 類對於反射起著核心的作用。但它是一個抽象的基類,Type有與每種資料類型對應的衍生類別,我們使用這個衍生類別的對象的方法、欄位、屬性來尋找有關該類型的所有資訊。
    擷取給定類型的Type引用有3種常用方式:
     ●使用 C# typeof 運算子。
        Type t = typeof(string);
    ●使用對象GetType()方法。
        string s = "grayworm";
        Type t = s.GetType(); 
    ●還可以調用Type類的靜態方法GetType()。
        Type t = Type.GetType("System.String");
 
方法大概就這樣 具體情況具體分析 

c# 反射

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.