反射概念:
在程序运行时动态获取类或对象的信息,具体包括了
动态 获取 加载程序集(Assmebly)
动态 获取 类型信息(如类、接口 等) - Type对象
在运行时,动态创建类型实例(new),以及 调用 和 访问 这些 实例 成员;
.Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机制。
.Net反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;
类型 | 作用 |
Assembly | 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。 |
Module | 包含模块的程序集以及模块中的类等。还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。 |
ConstructorInfo | 构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。使用Type的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。 |
MethodInfo | 方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信 息(如 abstract 或 virtual)等。使用Type的 GetMethods 或 GetMethod 方法来调用特定的方法。 |
FieldInfo | 字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如 static)等;并获取或设置字段值。 |
EventInfo | 事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等;并添加或移除事件处理程序。 |
PropertyInfo | 属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。 |
ParameterInfo | 参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等 |
在程序运行时,动态获取程序集:
class Program static void Mainstring args
Assembly ass AppDomain.CurrentDomain.GetAssemblies
Person p new Person
p.TestAssembly
Console.ReadKey
class Person
public string Name get
public int Age get
private int Id
public double Sum
public void
private void
public void
Assembly ass this.GetType.Assembly
Console.WriteLineass
Type types ass.GetTypes
foreach var item types
Console.WriteLineitem +
Type currentType ass.GetType
Console.WriteLinecurrentType
Type typeByFullName ass.GetType
Console.WriteLinetypeByFullName
Type this.GetType
Console.WriteLinetype
MethodInfo methods this.GetType.GetMethods
foreach var item methods
Console.WriteLineitem +
var members this.GetType.GetMembers
foreach var item members
Console.WriteLineitem
var member this.GetType.GetMember
foreach var item member
Console.WriteLineitem
FieldInfo field type.GetField
Console.WriteLinefield
PropertyInfo prop type.GetProperty
Console.WriteLineprop
View Code
在程序运行时,动态创建类型实例:
class Program static void Mainstring args
Person p new Person
p.CreatePersonObject
Console.ReadKey
public void
Type this.GetType
Person p Activator.CreateInstancetype as Person
Person p1 Activator.CreateInstancePerson
PropertyInfo prop type.GetProperty
prop.SetValuep1, ,null
Console.WriteLinep1.Name
MethodInfo method type.GetMethod
method.Invokep1, null
MethodInfo method1 type.GetMethod
object arrParams
method1.Invokep1, arrParams
MethodInfo method2 type.GetMethod
string retStr method2.Invokep1, null.ToString
Console.WriteLineretStr
public void
Console.WriteLine
public void ShowNumberint no
Console.WriteLineno
public string
View Code
通过反射找出类型的构造函数,然后调用构造函数来获取实例引用
public static void Type tpdatetime Type.GetType,
tpdatetime null
ConstructorInfo constructor tpdatetime.GetConstructornew Type typeofint, typeofint, typeofint, typeofint, typeofint, typeofint
constructor null
object instance constructor.Invokenew object , , , , ,
instance null
PropertyInfo props tpdatetime.GetPropertiesBindingFlags.Public BindingFlags.Instance
Console.WriteLine
foreach PropertyInfo item props
object objval item.GetValueinstance,null
Console.WriteLine,item.Name,objval??string.Empty
View Code
Activator.CreateInstance和Assembly.CreateInstance。这2种方法创建实例的区别:
Load、LoadFile、LoadForm:
Assembly assembly Assembly.Load//1 动态加载 默认加载当前路径的dll文件,不需要后缀,该方法传入的是Dll的名字,该Dll必须位于全局缓存GAC中才行,不然会报“System.IO.FileLoadException: 未能加载文件或程序集”的异常。Assembly assembly1 Assembly.LoadFile@// 必须是完整路径
Assembly assembly2 Assembly.LoadFrom// 可以是当前路径 也可以是完整路径
通过反射调用类的私有成员:
Person p new PersonType tPerson p.GetType
//得到私有字段的值:
FieldInfo privateField tPerson.GetField, BindingFlags.Instance BindingFlags.NonPublic
//设置私有成员的值:
privateField.SetValuep,
Console.WriteLineprivateField.GetValuep
//得到私有属性的值:
PropertyInfo privateProp tPerson.GetProperty, BindingFlags.Instance BindingFlags.NonPublic
//设置私有属性的值:
privateProp.SetValuep, ,null
Console.WriteLineprivateProp.GetValuep,null
//调用私有方法
MethodInfo privateMethod tPerson.GetMethod, BindingFlags.Instance BindingFlags.NonPublic
privateMethod.Invokep, null
还没有评论,来说两句吧...