目录
一、什么是反射
什么是元数据,什么是反射
文本和特新都是数据,变量类这些都是数据
路径:项目文件夹下bin\Debug\netcoreapp3.1
我们写的代码,编译成程序集,windows主要有两种程序集,第一种是dll,第二种是exe
生成为dll可以拿给别的开发者来使用,在游戏中经常会出现,提示缺少了dll,就是缺少了程序集
反射
反射是指可以访问、检测和修改它本身状态或行为的一种能力。我们可以使用反射动态地创建类型实例,将类型绑定到现有对象,或从现有对象中获取类型。然后可以调用类型方法或访问其字段属和属性。
二、反射的使用
反射的命名空间System.Reflection
编译后的代码,也就是我们的元数据,他们保存在程序集中。
那么我们可以通过反射来查看其他程序集和本身的元数据,这个行为被称为反射。
下面使用type类来进行反射数据
创建一个class1的类
class Class1
{
//字段
private int a;
public int b;
public string c;
//属性
public int D
{
get;set;
}
public int E
{
get; set;
}
///方法
public int getA()
{
return a;
}
}
在main函数中使用反射来获取数据信息
static void Main(string[] args)
{
//Type
Type t = typeof(Class1);
Console.WriteLine(t.Name);//类名
Console.WriteLine(t.Namespace);//命名空间
Console.WriteLine(t.Assembly);//程序集的属性
//通过GetFields()获取字段,返回的是FieldInfo[]的数组,他吧每个字段都封装成了多个FieldInfo
FieldInfo[] fis=t.GetFields();
Console.WriteLine("a字段是私密的,所以没获取到");
foreach (FieldInfo fi in fis)
{
Console.WriteLine(fi.Name);//类名
}
//获取所有属性
Console.WriteLine("获取所有属性");
PropertyInfo[] pfs=t.GetProperties();
foreach (PropertyInfo pf in pfs)
{
Console.WriteLine(pf.Name);//类名
}
//获取所有方法名
Console.WriteLine("获取所有方法名");
MethodInfo[] mis = t.GetMethods();
foreach (MethodInfo mi in mis)
{
Console.WriteLine(mi.Name);//类名
}
}
GetMethods()会获取到他父类的方法名,运行结果
另外一种获取type对象
Class1 c = new Class1();
Type t = c.GetType();
//Type
//Type t = typeof(Class1);
他们是一样的,通过类方法获取
三、如何加载程序集?
1,Assembly assembly1 =Assembly.Load("SomeAssembly");
根据程序集的名字加载程序集,它会在本地目录和全局程序集缓存目录查找符合名字的程序集。
2,Assembly assembly2 =Assembly.LoadFrom(@"c:\xx\xx\xx\SomeAssembly.dll")//这里的参数是程序集的完整路径名,它不会在其他位置搜索。
四、Assembly对象的使用
1,获取程序集的全名
string name = assembly1.Ful lName;
2,遍历程序集中定义的类型
Type[] types =theAssembly.GetTypes();
foreach(Type definedType in types) (
//
)
五、反射优缺点
优点:
- 提高程序的灵活性和扩展性
- 降低耦合性,提高自适应能力
- 允许程序创建和控制任何类的对象,无需提前编码目标类。
缺点:
- 性能问题:反射是一种解释操作,用于字段和方法接入时要慢于直接代码。所以反射机制主要用于在对灵活性和扩展性要求很高的系统上。普通程序不建议使用
- 使用反射会模糊程序内部逻辑,程序员需要在源代码中看到逻辑,反射却绕过源代码的技术。维护不好,反射比直接代码更复杂。