Directorio de artículos
1. Definición de reflexión
El comportamiento de un programa en ejecución para ver sus propios elementos u otros tipos de metadatos se denomina reflexión.
MVC, IOC, ORM, AOP todos usan la reflexión.
2. Ejemplo sencillo
class BaseClass
{
public int BaseField = 0;
}
class DerivedClass:BaseClass
{
public int DerviedField = 0;
}
static void Main(string[] args)
{
BaseClass bc = new BaseClass();
var dc = new DerivedClass();
BaseClass[] bca = new BaseClass[] {
bc, dc };
foreach (var v in bca)
{
Type t = v.GetType();
Console.WriteLine($"Object type:{t.Name}");
FieldInfo[] fi = t.GetFields();
foreach (var f in fi)
{
Console.WriteLine($"File :{f.Name}");
}
Console.WriteLine();
}
}
Resultado de salida:
Tipo de objeto: BaseClass
Archivo: BaseField
Tipo de objeto: DerivedClass
Archivo: DerviedField
Archivo: BaseField
3. Miembros de tipo de uso común
miembro | Tipo de miembro | descripción |
---|---|---|
Nombre | Atributos | Nombre del tipo de retorno |
Espacio de nombres | Atributos | Espacio de nombres de tipo de retorno |
Montaje | Atributos | Devuelve el conjunto de datos del tipo declarado. |
GetFields | método | Tipo de retorno de lista de campos |
GetProperties | método | Devuelve la lista de atributos |
GetMethods | método | Lista de métodos de tipo de retorno |
4. Utilice la reflexión sobre archivos dll
4.1 Lectura de archivos dll
通过程序集名称返回Assembly对象
Assembly ass = Assembly.Load("ClassLibrary831");
通过DLL文件名称返回Assembly对象
Assembly ass = Assembly.LoadFrom("ClassLibrary831.dll");
通过Assembly获取程序集中类
Type t = ass.GetType("ClassLibrary831.NewClass"); //参数必须是类的全名
通过Assembly获取程序集中所有的类
Type[] t = ass.GetTypes();
4.2 Ejemplos específicos
1. Estructura de directorio
2. Código
static void Main(string[] args)
{
// 加载 DLL 文件
// 这个是直接动态加载
Assembly assembly = Assembly.Load("LibA");
// 和上面的区别是这个得用 dll 文件
Assembly assembly1 = Assembly.LoadFrom("LibA.dll");
// 用绝对路径引入
Assembly assembly2 = Assembly.LoadFile("D:/Desktop/test01/ConsoleApp3/LibA/bin/Debug/netstandard2.0/LibA.dll");
var Tpye = assembly2;
Console.WriteLine(Tpye.FullName);
// 获取类型(这一步要在获得 Dll 文件的基础上进行)
Type type = assembly.GetType("LibA.Class1");
object o = Activator.CreateInstance(type);// 必须是个type类型,简单点说,必须是个类。
Console.WriteLine(type.Name);
// 用接口做强制规范,然他能 “点“ 出来
IAClasscs rel = type as IAClasscs;
rel.GetName();
//object mm = Activator.CreateInstance(type);
referencias
[1] https://www.cnblogs.com/Stephenchao/p/4481995.html
[2] https://www.bilibili.com/video/BV1hk4y1r7PZ