asp.net反射应用

反射的应用为了解藕程序,让程序日后的维护和二次开发时动用的代码部分很少。

要用到的命名空间using reflection

1.在程序运行时,(动态获取类或对象的信息)

       动态 获取 加载程序集(Assmebly)

       动态 获取 类型(如类、接口 等) - Type对象

       动态 获取 类型的成员 信息(如方法,字段,属性等);

2.在运行时,动态创建类型实例(new),以及 调用 和 访问 这些 实例 成员;

创建的步骤:

1 获取当前的程序集方式:

 1.1 获取当前的程序域的所有assembly : AppDomain.CurrentDomain.GetAssemblies()

 1.2获取当前的对象的程序集:this.GetType().Assembly

 1.3根据路径加载Assembly: Assembly.LoadFrom("路径") 或者 Assembly.load("当期的路径") 或 Assembly.LoadFile("路径")

 

2 获取Type对象 的方式

 2.1通过类获取对应的Type :Type t=Typeof(Person)

 2.2通过对象得Type t=p.GetType()

 2.3通过程序集获得当前的类 Type t=assembly.GetType("类名")

 2.4程序集的所有public 类 type[] t=assembly.GetExportedType()

 2.5所有类 Type[] t=Assembly.GetTypes()

对象的创建

Type pigType = ass.GetType("PigLib.Pig", false, true);
object instance1 = Activator.CreateInstance(pigType);

//总结:ass.CreateInstance()和Activator.CreateInstance() 要求类拥有一个无参数的构造函数

//3.0 通过有参数的构造函数进行实例的创建工作
//3.0.1 获取Pig类型中的构造函数对象
ConstructorInfo cinfo = pigType.GetConstructor(new Type[] { typeof(string) });
//3.0.2 调用构造函数
object instancd2 = cinfo.Invoke(new object[] { "小黑" }); //object instancd2 =new Pig("小黑");

获取字段的和方法的使用

//2.0 从ass中获取Pig类的Type类型
Type pigType = ass.GetType("PigLib.Pig", false, true);

//3.0从Type中获取字段的对象 FielidInfo
//注意点:BindingFlags.Instance | BindingFlags.NonPublic 表示获取类中的实例非公有字段
//BindingFlags.Instance :表示一个实例字段 BindingFlags.Static:表示一个静态字段
// BindingFlags.NonPublic:非公有的字段 BindingFlags.Public:公有的字段
//重点注意:如果要使用则 BindingFlags.Instance | BindingFlags.NonPublic要在一起
FieldInfo nameInfo = pigType.GetField("_name", BindingFlags.Instance | BindingFlags.NonPublic);

//4.0 给_name字段赋值
object instance = Activator.CreateInstance(pigType); //ass.CreateInstance("PigLib.Pig");
nameInfo.SetValue(instance, "小白");

//5.0 获取_name字段的值
object res = nameInfo.GetValue(instance);

MessageBox.Show(res.ToString());

属性:
type.Assembly:获取type所在的程序集对象
type.FullName:获取type对象对应的类的全名称,命名空间.类名
type.Name:获取type对象对应类的 名称,不带有命名空间的
type.IsArray:判断type是否为一个数组类
type.IsEnum:判断type是否为一个枚举类
方法:
type.IsAssignableFrom(Type i) :判断i是否实现了接口 type
type.IsSubclassOf(Type father):判断type是否继承了 father
type.IsInstanceOfType(object o) :判断 o 是否为type类的实例

type.GetFiled("gender"):获取type中名为gender的字段对象
type.GetMethod("SayHi"):对象
type.GetProperty("Age"):获取type中名为 Age 的属获取type中名为 SayHi 的方法性对象

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。