黑马程序员 C# 程序集和反射
2014-03-26 09:47
393 查看
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
.Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机制。
.Net反射机制主要提供了以下功能:
a.在程序运行时:动态 获取加载程序集; 动态获取类型(如类、接口等); 动态获取类型的成员信息(如方法,字段,属性等);
b.在运行时,动态创建(主要根据类名 或成员名 字符串动态创建)类型实例,以及 调用和 访问 这些 实例 成员;
1.反射-Assembly 程序集对象 using System.Reflection;
Assembly类 表示 某个程序集( .dll/exe )
获取程序集的方式:
获得当前程序域中 所有的Assembly:AppDomain.CurrentDomain.GetAssemblies()
获取当前 对象所在的Assembly:this.GetType().Assembly
根据路径加载Assembly :Assembly.LoadFrom(assPath)
2.反射- Type 类型对象
Type类,程序运行时一个class对应一个Type类的对象。通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方法等。
获得Type对象的方式: 1,2为获得单个类型对象,3,4,5 通过程序集获取Type
1.通过类 获得对应Type:Typet =typeof(Person)
2.通过对象获得 Type:Typet =p.GetType()
3.根据类的全名称获取程序集中定义的类:Type type=Assembly.GetType("BLL.Person")
4.获取程序集中定义的所有的public类:Type[] types =assembly.GetExportedTypes()
5.获取程序集中定义的所有的类型:Type[] types =assembly.GetTypes()
反射- Type 的成员
属性:
•type.Assembly:获取type所在的程序集对象
•type.FullName:获取type对象对应的类的全名称
•type.Name: 获取type对象对应类的 名称
•type.IsArray: 判断type是否为一个数组类
•type.IsEnum: 判断type是否为一个枚举类
方法:
•type.IsAssignableFrom(Type i):判断type是否实现了接口i
•type.IsSubclassOf(Type father):判断type是否继承了father
•type.IsInstanceOfType(objecto):判断o是否为type类的实例
•type.GetFiled("gender"):获取type中名为gender的字段对象
•type.GetMethod("SayHi"):获取type中名为SayHi的方法对象
•type.GetProperty("Age"):获取type中名为Age的属性对象
3.反射-FiledInfo字段对象
FiledInfo类代表某个类中的一个成员字段(类的全局变量)
例:操作对象的字段
publicclassDog
{
publicstringdogName;
publicintdogAge;
}
Dog dObj =newDog(){dogName="小花",dogAge=1 };
Type dType =dObj.GetType();
FiledInfo fiDN =dType.GetFiled("dogName");//获取字段对象
string strName =fiDN.GetValue(dObj);//获取dObj的dogName字段值
fiDN.SetValue(dObj,"小白");//设置dObj里的dogName字段值
4.反射-PropertyInfo属性对象
PropertyInfo类代表某个类中的一个属性
例:操作 对象 的属性
publicclassDog
{
publicstringName{get;set;}
publicintAge{get;set;}
}
Dog dObj =newDog(){Name="小花",Age=1};
Type dType =dObj.GetType();
PropertyInfo piN=dType.GetProperty("Name");//获取属性对象
string strName =piN.GetValue(dObj);//获取dObj的Name属性值
piN.SetValue(dObj,"小白");//设置dObj里的Name属性值
5.反射-MethodInfo方法对象
MethodInfo类 代表某个类中的一个方法
publicclassDog
{
publicstringSmile(string name)
{
return "一只会笑的狗:"+name;
}
}
Dog dObj =newDog();
Type dType =dObj.GetType();
MethodInfo method=dType.GetMethod("Smile"); //获取方法对象
object res1 = dObj.Smile("哇哈哈~~"); //*普通调用方法
object res2= method.Invoke(dObj,newobject[]{"小白"});
//*反射调用dObj的Smile方法
6.反射- 动态创建对象
1.objectres = Activator.CreateInstance(Typetype)
会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
2.使用构造器创建
publicclass Dog{
public Dog(stringname,intage){//构造函数代码... }
}
Type dType =typeof(Dog);//获取Dog类类型
对象
//获取构造器 对象(根据 参数列表的 参数类型 数组 获取)
ConstructorInfocotr=dType.GetConstructor(new Type[]{typeof(string),typeof(int)}
);objectresValue=cotr.Invoke(newobject[]{"小白",2});//调用dObj的Smile方法
7.反射 - 调用对象私有成员
Person p1 = new Person();
Type type = p1.GetType();
//BindingFlags.Instance表示是实例方法,也就是不是static方法
MethodInfom Haha = type.GetMethod("Haha", BindingFlags.NonPublic | BindingFlags.Instance);
mHaha.Invoke(p1,null);
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
.Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机制。
.Net反射机制主要提供了以下功能:
a.在程序运行时:动态 获取加载程序集; 动态获取类型(如类、接口等); 动态获取类型的成员信息(如方法,字段,属性等);
b.在运行时,动态创建(主要根据类名 或成员名 字符串动态创建)类型实例,以及 调用和 访问 这些 实例 成员;
1.反射-Assembly 程序集对象 using System.Reflection;
Assembly类 表示 某个程序集( .dll/exe )
获取程序集的方式:
获得当前程序域中 所有的Assembly:AppDomain.CurrentDomain.GetAssemblies()
获取当前 对象所在的Assembly:this.GetType().Assembly
根据路径加载Assembly :Assembly.LoadFrom(assPath)
2.反射- Type 类型对象
Type类,程序运行时一个class对应一个Type类的对象。通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方法等。
获得Type对象的方式: 1,2为获得单个类型对象,3,4,5 通过程序集获取Type
1.通过类 获得对应Type:Typet =typeof(Person)
2.通过对象获得 Type:Typet =p.GetType()
3.根据类的全名称获取程序集中定义的类:Type type=Assembly.GetType("BLL.Person")
4.获取程序集中定义的所有的public类:Type[] types =assembly.GetExportedTypes()
5.获取程序集中定义的所有的类型:Type[] types =assembly.GetTypes()
反射- Type 的成员
属性:
•type.Assembly:获取type所在的程序集对象
•type.FullName:获取type对象对应的类的全名称
•type.Name: 获取type对象对应类的 名称
•type.IsArray: 判断type是否为一个数组类
•type.IsEnum: 判断type是否为一个枚举类
方法:
•type.IsAssignableFrom(Type i):判断type是否实现了接口i
•type.IsSubclassOf(Type father):判断type是否继承了father
•type.IsInstanceOfType(objecto):判断o是否为type类的实例
•type.GetFiled("gender"):获取type中名为gender的字段对象
•type.GetMethod("SayHi"):获取type中名为SayHi的方法对象
•type.GetProperty("Age"):获取type中名为Age的属性对象
3.反射-FiledInfo字段对象
FiledInfo类代表某个类中的一个成员字段(类的全局变量)
例:操作对象的字段
publicclassDog
{
publicstringdogName;
publicintdogAge;
}
Dog dObj =newDog(){dogName="小花",dogAge=1 };
Type dType =dObj.GetType();
FiledInfo fiDN =dType.GetFiled("dogName");//获取字段对象
string strName =fiDN.GetValue(dObj);//获取dObj的dogName字段值
fiDN.SetValue(dObj,"小白");//设置dObj里的dogName字段值
4.反射-PropertyInfo属性对象
PropertyInfo类代表某个类中的一个属性
例:操作 对象 的属性
publicclassDog
{
publicstringName{get;set;}
publicintAge{get;set;}
}
Dog dObj =newDog(){Name="小花",Age=1};
Type dType =dObj.GetType();
PropertyInfo piN=dType.GetProperty("Name");//获取属性对象
string strName =piN.GetValue(dObj);//获取dObj的Name属性值
piN.SetValue(dObj,"小白");//设置dObj里的Name属性值
5.反射-MethodInfo方法对象
MethodInfo类 代表某个类中的一个方法
publicclassDog
{
publicstringSmile(string name)
{
return "一只会笑的狗:"+name;
}
}
Dog dObj =newDog();
Type dType =dObj.GetType();
MethodInfo method=dType.GetMethod("Smile"); //获取方法对象
object res1 = dObj.Smile("哇哈哈~~"); //*普通调用方法
object res2= method.Invoke(dObj,newobject[]{"小白"});
//*反射调用dObj的Smile方法
6.反射- 动态创建对象
1.objectres = Activator.CreateInstance(Typetype)
会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
2.使用构造器创建
publicclass Dog{
public Dog(stringname,intage){//构造函数代码... }
}
Type dType =typeof(Dog);//获取Dog类类型
对象
//获取构造器 对象(根据 参数列表的 参数类型 数组 获取)
ConstructorInfocotr=dType.GetConstructor(new Type[]{typeof(string),typeof(int)}
);objectresValue=cotr.Invoke(newobject[]{"小白",2});//调用dObj的Smile方法
7.反射 - 调用对象私有成员
Person p1 = new Person();
Type type = p1.GetType();
//BindingFlags.Instance表示是实例方法,也就是不是static方法
MethodInfom Haha = type.GetMethod("Haha", BindingFlags.NonPublic | BindingFlags.Instance);
mHaha.Invoke(p1,null);
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
相关文章推荐
- C#反射创建对象(根据程序集)
- 程序集和反射(C#)
- C#中使用反射显示程序集的所有类型和属性
- C#_Assembly-Reflection_程序集与反射 练习<二> 记事本插件编写
- 【C#进阶系列】23 程序集加载和反射
- 黑马程序员_学习日记43_609基础加强(多播委托、事件、程序集、反射)
- 程序集与反射技术(C#)
- C#使用反射加载多个程序集的实现方法
- 《CLR via C#》笔记——程序集的加载和反射(1)
- C# 如何利用反射来加载程序集,并调用程序集中有关类的方法
- C#中的程序集和反射
- C# 程序集 和 反射
- C#利用反射动态调用DLL并返回结果,和获取程序集的信息
- C# 程序集反射
- C# 如何利用反射来加载程序集,并调用程序集中有关类的方法【转】
- C#使用反射加载多个程序集
- C#学习-程序集和反射
- C#中的程序集和反射介绍
- C#2.0学习--反射与程序集
- 《CLR via C#》笔记——程序集的加载和反射(2)