//反射是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型
//(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。
//有了反射,即可对每一个类型了如指掌,如果获得了构造函数的信息,即可直接创建对象
class Program
{
//反射可以看到类的属性和方法,设置和获取属性值,调用方法
// { GetProperties 获取属性
//Type
// { GetMethods 获取方法
//
// { GetValue(实例)
//属性 ProPertyInfo
// { SetValue(实例,值)
//
//方法 MethodInfo invoke(实例,参数)
//
static void Main(string[] args)
{
Stu s = new Stu() { Name = "占山" };
Stu s2 = new Stu() { Name = "王五" };
Type t = s.GetType();
//获取所有属性名称
var ps = t.GetProperties();
//获取所有方法名称
var ms = t.GetMethods();
//显示属性
foreach (var i in ps)
{
Console.WriteLine(i.Name);
}
Console.WriteLine("-----------------------");
Console.WriteLine("-----------------------");
//显示方法 前面两个是只读和只写的两个方法,第三个是咱们定义的方法,后面四个是继承自Object的方法
foreach (var j in ms)
{
Console.WriteLine(j.Name);
}
Console.WriteLine("-----------------------");
Console.WriteLine("-----------------------");
//给第一个学生赋值
ps[0].SetValue(s, "里斯");
//读取值
Console.WriteLine(s.Name);
//获取第二学生的姓名
Console.WriteLine(ps[0].GetValue(s2));
Console.WriteLine("-----------------------");
Console.WriteLine("-----------------------");
//调用方法,第一个值是学生信息,第二个是方法参数,没有参数就传null
ms[2].Invoke(s, new object[] { "Hello","World"});
Console.Read();
}
//学生类
class Stu
{
public string Name { get; set; }
public void Say(string a1, string a2)
{
Console.WriteLine(a1+" "+a2);
}
}
//动态加载dll文件
static void Main(string[] args)
{
// 路径E盘下的dll文件
Assembly a = Assembly.LoadFile(@"e:ClassLibrary1.dll");
//获取所有类型
//Type[] atypess = a.GetTypes();
//foreach (Type t1 in atypess)
//{
// Console.WriteLine(t1);
//}
//类型全名
var s = a.CreateInstance("ClassLibrary1.Stu");
//类型全名
Type t = a.GetType("ClassLibrary1.Stu");
//要获取的属性名
var name = t.GetProperty("Name");
var age = t.GetProperty("Age");
//赋值
name.SetValue(s, "张三");
age.SetValue(s, 19);
//获取方法
MethodInfo m = t.GetMethod("Say");
//调用方法,传入对应参数
m.Invoke(s,new object[] { "晚上"});
Console.ReadKey();
}
}