C#的反射
`#region 知识点五 语法相关
#region Type类
//类的信息类
//它是反射功能的基础
//它是访问元数据的主要方式
//使用 Type 的成员获取 有关类型声明的信息
//有关类型的成员(如构造函数、方法、字段、属性和类的事件)
#region Type-- 1、获取Type
//1.万物之父Object 中的GetType() 可以获取对象的Type
int a = 42;
Type type = a.GetType();
Console.WriteLine(type);
//2.通过typeof关键字 传入类名 也可以得到对象的Type
Type type2 = typeof(int);
Console.WriteLine(type2);
//3.通过类的名字 也可以获取类型
//注意,类名必须包含命名空间,不然找不到
Type type3 = Type.GetType("System.Int32");
Console.WriteLine(type3);
#endregion
#region Type-- 2、得到类的程序集信息
//可以通过Type得到类所在的程序集信息
Console.WriteLine(type.Assembly);
Console.WriteLine(type2.Assembly);
Console.WriteLine(type3.Assembly);
#endregion
#region Type-- 3、获取类中所有的公共成员
//首先得到Type
Type t = typeof(Test);
//然后得到所有公共成员(命名空间 using System.Reflection )
MemberInfo[] infos = t.GetMembers();
for (int i = 0; i < infos.Length; i++)
{
Console.WriteLine(infos[i]);
}
#endregion
#region Type-- 4、获取类的公共构造函数并调用
//1.获取所有构造函数
ConstructorInfo[] ctors = t.GetConstructors();
for (int i = 0; i < ctors.Length; i++)
{
Console.WriteLine(ctors[i]);
}
//2.获取其中一个构造函数 并执行
//得构造函数传入 Type数组 数组中内容按照顺序是参数类型
//执行构造函数传入 object数组 表示按顺序传入的具体参数
//2--1得到无参构造
ConstructorInfo info = t.GetConstructor(new Type[0]);
//执行无参构造 ,无参构造如果没有参数,传null 即可
Test obj = info.Invoke(null) as Test;
Console.WriteLine(obj.j);
//2--2得到有参构造:一个参数的有参构造
ConstructorInfo info2 = t.GetConstructor( new Type[] { typeof(int)} );
//执行有参构造
obj = info2.Invoke(new object[] { 123 }) as Test;
Console.WriteLine(obj.str);
//两个参数的有参构造
ConstructorInfo info3 = t.GetConstructor(new Type[] { typeof(int), typeof(string) });
obj = info3.Invoke(new object[] { 911, "拜拜阿白白" }) as Test;
Console.WriteLine(obj.str);
#endregion
#region Type-- 5、获取类的公共成员变量
//1.得到所有成员变量
FieldInfo[] fieldInfos = t.GetFields();
for (int i = 0; i < fieldInfos.Length; i++)
{
Console.WriteLine(fieldInfos[i]);
}
//2.得到指定名称的公共成员变量
FieldInfo InfoJ = t.GetField("j");
Console.WriteLine(InfoJ);
//3.通过反射获取和设置对象的值
Test test = new Test();
test.j = 6677;
test.str = "哈哈哈哈哈哈哈";
// 3-1通过反射 获取对象的某个变量的值
Console.WriteLine(InfoJ.GetValue(test));
// 3-2通过反射 设置指定对象的某个变量的值
InfoJ.SetValue(test,1122334455);
Console.WriteLine(InfoJ.GetValue(test));
Console.WriteLine(test.j);
#endregion
#region Type-- 6、获得类的公共成员方法
//通过Type类的GetMethod方法 得到类中的 方法
//MethodInfo 是方法的反射信息
Type strType = typeof(string);
//1.如果存在方法重载,用Type数组表示参数类型
MethodInfo[] methods = strType.GetMethods();
for (int i = 0; i < methods.Length; i++)
{
Console.WriteLine(methods[i]);
}
MethodInfo subStr = strType.GetMethod("Substring",
new Type[] { typeof(int), typeof(int) });
//2.调用该方法
//注意:如果是静态方法 Invoke中第一个参数传null 即可
string str = "abcdefghijk";
//第一个参数 相当于 是哪个对象要执行这个成员方法
object result = subStr.Invoke(str,new object[] {2,5});
Console.WriteLine( result);
MethodInfo subStr2 = strType.GetMethod("Substring",
new Type[] { typeof(int), typeof(int) });
#endregion
#region Type-- 7、得枚举、事件、接口、属性
//Type
//得枚举
//GetEnumName;
//GetEnumNames;
//得事件
//GetEvent
//GetEvents
//得接口
//GetInterface
//GetInterfaces
//得属性
//GetProperty
//GetPropertys
#endregion
#endregion Type结尾
#region Assembly类
//程序集类
//主要用来加载其他程序集,加载后
//才能用Type来使用其他程序集中的信息
//如果想要使用不是自己程序集中的内容 需要先加载程序集
//比如Dll 文件(库文件)
//简单的把库文件看成一种代码仓库,它能提供给使用者一些可以直接拿来用的变量、函数或类
//三种加载程序集的函数
//一般用来加载在同一文件夹下的其他程序集
Assembly assembly = Assembly.Load("程序集名称");
//一般用来加载不在同一文件夹下的其他程序集
Assembly assembly2 = Assembly.LoadFrom("包含程序集清单的文件的名称或路径");
Assembly assembly3 = Assembly.LoadFile("要加载的文件的完全限定路径");
//1.先加载一个指定的程序集
Assembly asembly= Assembly.LoadFile("@...");
Type[] types = asembly.GetTypes();
for (int i = 0; i < types.Length; i++)
{
Console.WriteLine(types[i]);
}
//2.在加载程序集中的一个类对象 之后才能使用反射
Type icon = asembly.GetType("Lesson18_练习题.Icon"); //命名空间.类名
MemberInfo[] members = icon.GetMembers();
for (int i = 0; i < members.Length; i++)
{
Console.WriteLine(members[i]);
}
//通过反射 实例化一个对象
//首先得到枚举Type 来得到可以传入的参数
Type moveDir = asembly.GetType("Lesson18_练习题.E_MoveDir");
FieldInfo right = moveDir.GetField("Right");//得到枚举值 因为枚举值也相当于枚举类型的字段
//直接实例化对象
object iconObj = Activator.CreateInstance(icon, 10, 5, right.GetValue(null));
//得到对象中的方法 通过反射
MethodInfo move = icon.GetMethod("Move");
MethodInfo draw = icon.GetMethod("Draw");
MethodInfo clear = icon.GetMethod("Clear");
Console.Clear();
while (true)
{
Thread.Sleep(1000);
clear.Invoke(iconObj,null);
move.Invoke(iconObj,null);
draw.Invoke(iconObj,null);
}
#endregion Assembly结尾
#region Activator类
//用于快速实例化一个类
//用于将 Type对象 快捷实例化对象
//先得到Type
//然后 快速实例化一个对象
Type testType = typeof(Test);
//1.无参构造
Test testObj = Activator.CreateInstance(testType) as Test;
Console.WriteLine(testObj.str);
//2.有参构造
testObj = Activator.CreateInstance(testType, 199) as Test;
Console.WriteLine(testObj);
testObj = Activator.CreateInstance(testType, 10086,"我勒个去") as Test;
Console.WriteLine(testObj);
#endregion Activator 结尾
#endregion
`

浙公网安备 33010602011771号