Sintaxis básica de reflexión de C #



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

Inserte la descripción de la imagen aquí
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

Supongo que te gusta

Origin blog.csdn.net/zhaozhao236/article/details/111656721
Recomendado
Clasificación