標籤:
using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Reflection;namespace codeTest{ class Program { static void Main(string[] args) { string str = "Hello"; //C#中基於System.Type的反射 Type t = str.GetType(); Console.WriteLine(t.FullName); Type t2 = Type.GetType("System.String", false, true); Console.WriteLine(t2.FullName); Type t3 = typeof(string); Console.WriteLine(t3.FullName); //C#中對於方法、屬性等的反射 //GetMethods(t, BindingFlags.Public | BindingFlags.Instance); Console.WriteLine("{0}", t.GetMethod("Copy")); t.GetProperties(); t.GetFields(); //C#中動態載入以及延遲綁定 //擷取程式集 Assembly assembly = Assembly.Load("codeTest"); //Assembly assembly2 = Assembly.LoadFrom("codeTest.dll"); //從程式集中擷取指定物件類型; Type type = assembly.GetType("codeTest.User"); //使用Activator建立執行個體(無參數建構函式) var user1 = Activator.CreateInstance(type); //使用Activator建立執行個體(帶參數建構函式) var user2 = Activator.CreateInstance(type, "薄暮"); //使用Assembly建立執行個體(無參數建構函式) var user3 = assembly.CreateInstance("codeTest.User"); //反射無參建構函式 ConstructorInfo constructor1 = type.GetConstructor(new Type[] { }); var user4 = constructor1.Invoke(new object[] { }); //反射有參建構函式 ConstructorInfo constructor2 = type.GetConstructor(new Type[] { typeof(string) }); var user5 = constructor2.Invoke(new object[] { "薄暮" }); //調用public函數(無參數) type.InvokeMember("PublicShow", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, user1, null); //調用public函數(帶參數) string returnValue = type.InvokeMember("GetString", BindingFlags.InvokeMethod | BindingFlags.OptionalParamBinding, null, user1, new object[] { "薄暮" }) as string; // 調用靜態方法 string returnValue2 = type.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, null, new object[] { }) as string; // 調用私人方法 . type.InvokeMember("PrivateShow", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, user1, new object[] { }); //反射屬性 var Name = type.InvokeMember("Name", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] { }) as string; //設定屬性(設定Name屬性為"新屬性") type.InvokeMember("Name", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] { "新屬性" }); //反射欄位 string Field = type.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] { }) as string; //設定欄位(設定Field欄位為"新欄位") type.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, user1, new object[] { "新欄位" }); Console.ReadLine(); } public static void GetMethods(Type t, BindingFlags f) { MethodInfo[] info = t.GetMethods(f); foreach (var item in info) { Console.WriteLine("{0}", item.Name); } } } public class User { //欄位 public string Field; //屬性 public string Name { get; set; } //建構函式 public User() { this.Name = "無參構造"; } public User(string name) { this.Name = name; } //public函數 public void PublicShow() { Console.WriteLine(string.Format("反射調用一個public方法")); } //private函數 private void PrivateShow() { Console.WriteLine(string.Format("反射調用一個Private方法")); } //static函數 public static string StaticMethod() { return "反射調用了一個Static方法"; } //帶參帶傳回值函數 public string GetString(string name) { return string.Format("大家好,我的名字是:{0}!", name); } //事件 public event EventHandler eventHandler; //事件處理函數 public void DoEvent() { if (eventHandler != null) eventHandler(null, EventArgs.Empty); } }}
C#的反射機制