1.查找類型、屬性、方法
在這個類中找工具—>選項—>項目和解決方案—>總是顯示解決方案 然后添加一個類庫在這個類中填寫變量、屬性、方法。
例如
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace STtudent { public class Class1 { public void shop() { Console.WriteLine("添加程序集成功"); } Public int i; } }
添加成功會在Debug中出現
Student.dll
在有主函數的類中引用命名空間(using System.Reflection)然后引用—>添加引用—>項目—>Student.dll——確定
事例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace 反射一 { class Program { static void Main(string[] args)
{
//加載程序集
Assembly.Load("Student");
Assembly asb=Assembly.LoadFrom("Student.dll");
//利用相對路徑添加程序集
Assembly asse = Assembly.LoadFile(@"E:\C#的基礎知識\2010-01-26\反射一\Student\bin\Debug\Student.dll");
Console.WriteLine(asse.FullName);
//加載類
Type pe=asb.GetType("Student.Class1");
//打印的是空間名和類名
Console.WriteLine(pe);
Console.Read();
}
}
}
使用 Assembly 定義和加載程序集,加載在程序集清單中列出的模塊,以及從此程序集中查找類型並創建該類型的事例。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace 反射一 { class Program { static void Main(string[] args) { //加載程序集 Assembly ass=Assembly.Load("Student"); Console.WriteLine(ass.ToString()); Assembly asb=Assembly.LoadFrom("Student.dll"); Type pe=asb.GetType("Student.Class1"); //Console.WriteLine(pe); Console.WriteLine(pe.FullName); FieldInfo[] fio = pe.GetFields(); //遍歷字段 foreach (FieldInfo i in fio) { //獲取此字段對像的類型 (Student.Class1) //Console.WriteLine(i.FieldType); //Console.WriteLine(i.ToString()); Console.WriteLine(i.Name); } //指定綁定約束搜索指定成員類型的指定成員 //MemberInfo[] mi = pe.GetMembers(); //foreach (MemberInfo m in mi) //{ // //指定成員是一個字段 // if (m.MemberType == MemberTypes.Field) // { // Console.WriteLine(m.Name); // } // //指定該成員是一個方法 (get_Name是屬性中的一個方法。) // else if (m.MemberType == MemberTypes.Method) // { // Console.WriteLine(m.Name); // } // //指定該成員是一個屬性 顯示的是所有的屬性 // else if (m.MemberType == MemberTypes.Property) // { // Console.WriteLine(m.Name); // } // else if(m.MemberType==MemberTypes.Constructor) // { // Console.WriteLine("構造方法有:" + m.Name); // } //} Console.Read(); } } }
使用 FieldInfo 了解以下信息:字段的名稱、訪問修飾符(如 public 或 private)和實現詳細信息(如 static)等;並獲取或設置字段值。
使用 MethodInfo 了解以下信息:方法的名稱、返回類型、參數、訪問修飾符(如 public 或 private)和實現詳細信息(如 abstract 或 virtual)等。使用 Type 的 GetMethods 或 GetMethod 方法來調用特定的方法。
添加的類中的東西
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Student { public class Class1 { string name; public string Name { get { return name; } set { name = value; } } int age; public int Age { get { return age; } set { age = value; } } string homeTown; public string HomeTown { get { return homeTown; } set { homeTown = value; } } public Class1() { } public Class1(string name, int age) { this.name = name; this.age = age; } public Class1(string name, int age, string hometown) : this(name, age) { this.homeTown = hometown; } public void Eat() { Console.WriteLine("吃飯"); } } }
2.用反射的方法創建對象,為類中的內容添值
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { #region 添加值的第一種方法 Assembly ass = Assembly.Load("zpboy"); Type tp = ass.GetType("zpboy.Class1"); //CreateInstance(他的英文意思是create創建instance實例)從此程序集中查找指定的類型,並使用系統激活器創建它的實例。 object o = ass.CreateInstance("zpboy.Class1"); //把o類型轉換成Class1類型 zpboy.Class1 zc = o as zpboy.Class1; zc.Name = "張三"; zc.Age = 15; zc.Eat(); Console.WriteLine("姓名:{0} 年齡:{1}", zc.Name, zc.Age); #endregion #region 添加值的另一種方法 Assembly ass1 = Assembly.Load("zpboy"); Type tp1 = ass1.GetType("zpboy.Class1"); object o1 = ass1.CreateInstance("zpboy.Class1"); Type[] t = new Type[2]; t[0] = typeof(string); t[1] = typeof(int); //GetConstructor搜索其參數與指定數組中的類型匹配的公共實例構造函數 //ConstructorInfo發現構造函數屬性並提供構造函數原數據的訪問權。 ConstructorInfo con = tp1.GetConstructor(t); con.Invoke(o1, new object[] { "小崔", 20 }); //使用 Type 的 GetMethods 或 GetMethod 方法來調用特定的方法。 MethodInfo m = tp1.GetMethod("Display"); m.Invoke(o1, null); MethodInfo mt = tp1.GetMethod("Eat"); mt.Invoke(o1, null); object j = ass1.CreateInstance("zpboy.Class1"); Type[] ty = new Type[3]; ty[0] = typeof(string); ty[1] = typeof(int); ty[2] = typeof(string); ConstructorInfo con1 = tp1.GetConstructor(ty); //Invoke使用指定的參數調用當前實例所表示的方法或構造函數 con1.Invoke(j, new object[] { "王五", 15, "保定" }); MethodInfo met = tp1.GetMethod("Show"); met.Invoke(j, null); #endregion #region 最后添值的方法 Assembly ass2 = Assembly.Load("zpboy"); Type tp2 = ass2.GetType("zpboy.Class1"); //創建對象(Activator催化劑) object ob = Activator.CreateInstance(tp2, new object[] { "小劉", 23, "河北" }); //調用實際方法 MethodInfo mti = tp2.GetMethod("Show"); mti.Invoke(ob, null); #endregion #region Assembly ass3 = Assembly.Load("zpboy"); Type tp3 = ass3.GetType("zpboy.Class1"); object o3=Activator.CreateInstance(tp3,new object[]{"zhangsan",12}); MethodInfo me1 = tp3.GetMethod("Display1"); me1.Invoke(o3,new object[]{"學習"}); #endregion Console.Read(); } } }
創建的類
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace zpboy { public class Class1 { string name; public string Name { get { return name; } set { name = value; } } int age; public int Age { get { return age; } set { age = value; } } string homeTown; public string HomeTown { get { return homeTown; } set { homeTown = value; } } public Class1() { } public Class1(string name, int age) { this.name = name; this.age = age; } public Class1(string name, int age, string hometown) : this(name, age) { this.homeTown = hometown; } public void Eat() { Console.WriteLine("吃飯"); } public void Display() { Console.WriteLine("姓名:{0},年齡:{1}",name,age); } public void Show() { Console.WriteLine("姓名:{0} 年齡:{1} 家鄉:{2}", name, age, homeTown); } Public void Display(string gongzuo) { Console.WriteLine(gongzuo); } } }
自定義特性類
l 正確設計自定義屬性類的主要步驟如下:
l 聲明屬性類
l 聲明構造函數
l 聲明屬性
1. 工具——選項——項目和解決方案——總是顯示解決方案
2. 添加類庫
Class1類
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ClassLibrary1 { [AttributeUsage(AttributeTargets.Class| AttributeTargets.Method,AllowMultiple=true,Inherited=true)] public class Class1:System.Attribute { int age; public int Age { get { return age; } set { age = value; } } string name; public string Name { get { return name; } set { name = value; } } string level; public string Level { get { return level; } set { level = value; } } public Class1() { age=0; name = "不詳"; level = "不詳"; } public Class1(string name,int age) { this.name = name; this.age = age; } } }
類Class2
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ClassLibrary1 { [Class1("張三",24,Level="同學你好")] class Class2:System.Attribute { [Class1("里斯",23,Level="同學你也好")] public void Eat() { } } } 主函數 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Assembly ass = Assembly.Load("ClassLibrary1"); Type tp = ass.GetType("ClassLibrary1.Class2"); object[] ob = tp.GetCustomAttributes(typeof(ClassLibrary1.Class1), false); ClassLibrary1.Class1 cc = ob[0] as ClassLibrary1.Class1; Console.WriteLine("類型名為{0} 是由{1}創建的 他的年齡是{2} 他要說的話是{3}", tp.Name, cc.Name, cc.Age, cc.Level); Assembly ass1 = Assembly.Load("ClassLibrary1"); Type tp1 = ass1.GetType("ClassLibrary1.Class2"); MethodInfo met = tp1.GetMethod("Eat"); //GetCustomAttributes在派生類中被重寫時,返回有System.type標示的自定義屬性數組。 //(typeof(ClassLibrary1.Class1), true)要搜索的屬性類型,只返回可分配給此類型的屬性。 object[] ob1 = met.GetCustomAttributes(typeof(ClassLibrary1.Class1), true); ClassLibrary1.Class1 cc1 = ob1[0] as ClassLibrary1.Class1; Console.WriteLine("方法的名字是{0} 是由{1}創建的 他的年齡是{2} 他要說的話是{3}", met.Name, cc1.Name, cc1.Age,cc1.Level); Console.Read(); } } }
完畢!哪里有錯誤的地方各位大蝦積極指正昂,小妹恭候!