反射
1.0 获取程序集对象
2.0 获取 程序集里的 类 的 类型对象(类的类)
3.0 监测 类 是否实现了某个接口
4.0 字段的 操作
5.0 属性的 操作
6.0 方法的 操作
7.0 通过激活器创建 对象
8.0 通过构造函数 创建 对象
9.0 获取私有成员
using System.Reflection;//导入反射命名空间
创建一个类或类库 设置一个委托 对象
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace S01反射
{
public delegate void DGSayHi(string name);
}
创建一个测试类 验证 event
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace S01反射
{
public class Test
{
public event DGSayHi dgSayHi;
/* 事件编译后:
* private DGSayHi dgSayHi;
* public event DGSayHi dgSayHi
* {
* add{ dgSayHi +=value; }
* remove{ dgSayHi -= value; }
* }
*/
private string name;
public string Name
{
get { return name; }
set { name=value; }
}
public void Test2()
{
dgSayHi = new DGSayHi(T);
}
public void T(string a)
{ }
}
}
Cat类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace S02MODEL
{
public class Cat:IFlyable
{
string name;
public string Bark()
{
return "喵~~" + name;
}
public void Fly()
{
System.Windows.Forms.MessageBox.Show("我会飞哦~~小猫");
}
}
}
Dog类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace S02MODEL
{
public class Dog
{
public Dog(string name) {
this.name = name;
}
public Dog(string name,bool gender)
{
this.name = name;
this.gender = gender;
}
private bool gender;
public string name;
public int Age
{
get;
set;
}
public string Bark()
{
return "汪~~" +this.name;
}
public string Bark(string pinzhong,int aaa)
{
return "汪~~"+pinzhong+",name=" + this.name;
}
public static string Bit()
{
return "咬死你~~~~~!";
}
public static string Bit2(string toEr,string fromEr)
{
return "咬死你~~~~~!" + toEr + "," + fromEr;
}
}
}
接口
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace S02MODEL
{
public interface IFlyable
{
void Fly();
}
}
Pig类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace S02MODEL
{
internal class Pig
{
public string name;
}
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;//导入反射命名空间
using S02MODEL;
namespace S01反射
{
public partial class Form1 : Form
{
//Test t = new Test();
t.dgSayHi = null;
t.dgSayHi("123");
通过事件 来操作 委托变量!
通过事件 向其封装的 委托变量 注册 一个方法
//t.dgSayHi += t_dgSayHi;
通过事件 向其封装的 委托变量 移除 一个方法
//t.dgSayHi -= t_dgSayHi;
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 1.0 获取程序集对象
/// </summary>
private void btnRef01_Click(object sender, EventArgs e)
{
//1.获取当前正在运行的 程序集对象
//Assembly ass01 = Assembly.GetExecutingAssembly();
//Type [] types = ass01.GetTypes();
//***********【重点】2.按照指定路径 加载程序集对象***************
Assembly ass02 = Assembly.LoadFrom(@"F:\03.Net\DotNet\反射\Code\S01反射\S02MODEL\bin\Debug\S02MODEL.dll");
Type[] types = ass02.GetTypes();
//3.获取当前正在运行的 应用程序域 里的所有的程序集
//Dog dog = new Dog("小白");
//AppDomain domain = AppDomain.CurrentDomain;
//Assembly [] asses= domain.GetAssemblies();
}
/// <summary>
/// 2.0 获取 程序集里的 类 的 类型对象(类的类)
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnType_Click(object sender, EventArgs e)
{
//1.通过对象获取 其类型
S02MODEL.Dog dog = new Dog("小白");
Type dogType01 = dog.GetType();
//Type dogType02 = GetObjType(dog);
//2.直接 获取 指定 类的 类型对象
Type catType03 = typeof(Test); //typeof(S02MODEL.Cat);
//3. 获取程序集里 的类型Type----------------------------
Assembly ass02 = Assembly.LoadFrom(@"F:\03.Net\DotNet\反射\Code\S01反射\S02MODEL\bin\Debug\S02MODEL.dll");
//3.1.获取程序集里的一个 类型 对象---------------
//Type typeCat = ass02.GetType("S02MODEL.Cat");
1.1获取类里的 各种成员 对象
//FieldInfo [] fields = typeCat.GetFields();
//MethodInfo[] methods = typeCat.GetMethods();
//ConstructorInfo [] cons= typeCat.GetConstructors();
//3.2.通过程序集 获取 所有的 public 类的类型对象
Type[] publicTypes = ass02.GetExportedTypes();
//3.3.通过程序集 获取 所有的类
Type[] types = ass02.GetTypes();
}
Type GetObjType(object obj)
{
return obj.GetType();
}
/// <summary>
/// 3.0 监测 类 是否实现了某个接口
/// </summary>
private void btnTestInterface_Click(object sender, EventArgs e)
{
Type flyType = typeof(S02MODEL.IFlyable);
Type catType = typeof(S02MODEL.Cat);
Type dogType = typeof(S02MODEL.Dog);
//IsAssignableFrom 判断 某个类 是否实现了 flyType接口!
MessageBox.Show(flyType.IsAssignableFrom(catType).ToString());
MessageBox.Show(flyType.IsAssignableFrom(dogType).ToString());
Dog dog = new Dog("小白");
//判断 dog对象 是否是 Dog类的实例!
MessageBox.Show(dogType.IsInstanceOfType(dog).ToString());
}
/// <summary>
/// 4.0 字段的 操作
/// </summary>
private void btnField_Click(object sender, EventArgs e)
{
//获取 Dog 类的类型对象(描述类信息)
Type typeDog = typeof(Dog);
//获取 Dog类 的 name 字段对象(描述字段信息)
FieldInfo fName = typeDog.GetField("name");
Dog dog = new Dog("小白");
//通过字段对象 为 Dog对象 里的 这个字段 赋值
fName.SetValue(dog, "来福旺财");//dog.name = "来福旺财";
//通过字段对象 从 Dog对象 里的 这个字段 取值
string dogNameStr = fName.GetValue(dog).ToString();
}
/// <summary>
/// 5.0 属性的 操作
/// </summary>
private void btnProperty_Click(object sender, EventArgs e)
{
//Type typeDog = typeof(Dog);
Dog dog = new Dog("小白") { name = "小标", Age = 1 };
//1.获取对象的类型对象
Type typeDog = dog.GetType();
//2.获取 对象的 Age 属性对象
PropertyInfo proAge = typeDog.GetProperty("Age");
//3.通过属性对象 获取 dog实例 中的 Age属性的值
int age = (int)proAge.GetValue(dog, null);
//4.通过属性对象 设置 dog实例 中的 Age属性的值
proAge.SetValue(dog, 10, null);
}
/// <summary>
/// 6.0 方法的 操作
/// </summary>
private void btnMethod_Click(object sender, EventArgs e)
{
//此对象所属的Dog类来自于 第一个项目中 添加的 S02Model程序集!
Dog dog = new Dog("小白") { name = "小白2", Age = 22 };
//经典错误:两个同名类,来自复制出来的 不同的程序集,也不能算作同一个类!
//Assembly ass = Assembly.LoadFrom(@"F:\03.Net\DotNet\反射\Code\S01反射\S02MODEL\bin\Debug\S02MODEL.dll");
此Dog类型,来自于 第二个项目中 的 程序集!
//Type typeDog2 = ass.GetType("S02MODEL.Dog");
//MethodInfo methodBark = typeDog2.GetMethod("Bark");
报错:因为 dog 对象 所属的类 来自于第一个项目的引用程序集;而methodBark方法所属的类来自于 第二个项目的程序集
//methodBark.Invoke(dog, null);
Type dogType = typeof(Dog);
//1.获取 Dog类里的 Bark 方法对象
MethodInfo method = dogType.GetMethod("Bark",new Type[0]);
//通过方法对象 调用方法本身方法体,同时 将dog 传给方法里的 this !
string returnValue = method.Invoke(dog, null).ToString();
//1.1获取重载的方法时,要传入 形参列表类型数组
MethodInfo method12 = dogType.GetMethod("Bark", new Type[2] { typeof(string),typeof(int) });
string returnValue12 = method12.Invoke(dog, new object[1] { "金毛巡回猎犬" }).ToString();
//2.调用静态方法:
//获取 Dog类里的 Bit 方法对象
MethodInfo method2 = dogType.GetMethod("Bit");
//通过方法对象 调用静态方法本身方法体,不需要为 this 传参!
string returnValue2 = method2.Invoke(null, null).ToString();
//调用带参数的 静态方法
//获取 Dog类里的 Bit2 方法对象
MethodInfo method3 = dogType.GetMethod("Bit2");
//通过方法对象 调用静态方法本身方法体,不需要为 this 传参!
string returnValue3 = method3.Invoke(null, new object[2] { "中国", "美国" }).ToString();
}
//------------------------------------------------------------------
/// <summary>
/// 1.0 通过激活器创建 对象
/// </summary>
private void btnCreateInstance_Click(object sender, EventArgs e)
{
//1.1通过激活器 根据类型 创建 对象
Type dogType = typeof(Dog);
//缺点:只能调用无参的构造函数!
Dog dog1 = Activator.CreateInstance(dogType) as Dog; //相当于 new Dog();
//1.2通过程序集 创建 程序集里某个类 的对象
//Assembly ass = Assembly.LoadFrom(@"F:\03.Net\DotNet13\反射\Code\S01反射\S01反射\bin\Debug\S02MODEL.dll"); //Assembly.GetExecutingAssembly();
程序集 根据提供的类名 找到 程序集里的类型,并 创建对象
//object dog2 = ass.CreateInstance("S02MODEL.Dog") as Dog;//其实 内部 也调用了 Activator.CreateInstance
}
object CreateAObj(Type type)
{
return Activator.CreateInstance(type);
}
/// <summary>
/// 2.0 通过构造函数 创建 对象
/// </summary>
private void btnConstructor_Click(object sender, EventArgs e)
{
Type dogType = typeof(Dog);
//根据构造函数形参 的类型 个数,获取 指定的构造函数对象
ConstructorInfo cons1 = dogType.GetConstructor(new Type[1] { typeof(string) });
//通过构造函数创建对象
Dog dog = cons1.Invoke(new object[1] { "大黄~" }) as Dog;
}
//-------------------------------------------------------------------
/// <summary>
/// 1.0 获取私有成员
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGetNonPublick_Click(object sender, EventArgs e)
{
Dog dog = new Dog("小白2",true);
Type dogType = dog.GetType();
//获取 非公有的 实例成员
FieldInfo gender = dogType.GetField("gender",BindingFlags.Instance | BindingFlags.NonPublic);
//dogType.GetMethod("Bark", BindingFlags.Instance | BindingFlags.NonPublic);
bool genderBool = Convert.ToBoolean(gender.GetValue(dog));
}
}
}