標籤:
反射的用途: (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# 反射