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 应用 AttributeUsageAttribute
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(); } } }
完毕!哪里有错误的地方各位大虾积极指正昂,小妹恭候!