Conceptos básicos de reflexión de C#

comenzar

 1. El espacio de nombres utilizado

    Sistema.Reflexión
    Sistema.Tipo
    Sistema.Reflexión.Ensamblaje

Dos, la categoría principal

    Clase System.Type: esta clase proporciona acceso a la información para cualquier tipo de datos dado.
    Clase System.Reflection.Assembly: se puede usar para acceder a información sobre un ensamblaje determinado o para cargar este ensamblaje en un programa.

ilustrar

 1. Clase System.Type

 La clase System.Type juega un papel central en la reflexión. Es una clase base abstracta. El tipo tiene clases derivadas correspondientes a cada tipo de datos. Usamos los métodos, campos y propiedades de los objetos de esta clase derivada para encontrar toda la información sobre el tipo.

Representa declaraciones de tipo: tipos de clase, tipos de interfaz, tipos de matriz, tipos de valor, tipos de enumeración, parámetros de tipo, definiciones de tipo genérico y tipos genéricos construidos abiertos o cerrados.

Analizar información de tipo de Tipo:

 A. Una forma común de juzgar las referencias de un tipo dado:

1. Usar el operador typeof de C#

Tipo t = tipo de (cadena);

2. Utilice el método de objeto GetType()

  cadena s = "i3yuan"; 
  Escriba t2 = s.GetType();

3. Llame al método estático GetType() de la clase Type estática

  Escriba t3 = Tipo.GetType("System.String");

Después de obtener el tipo Type de las tres formas anteriores, puede usar t para detectar la estructura en la cadena

  foreach (MemberInfo mi en t.GetMembers()) 
  { 
       Console.WriteLine("{0}/t{1}", mi.MemberType, mi.Name); 
  }

B. Atributos de clase de tipo:

  1. Espacio de nombres y nombre de tipo

        Name El nombre del tipo de datos
        FullName El nombre completo del tipo de datos (incluido el nombre del espacio de nombres)
        Namespace El nombre del espacio de nombres que define el tipo de datos

  2. Clases y delegados

        Type.IsClass Determina si un tipo es una clase o un delegado. Quienes cumplan las condiciones tendrán clases ordinarias (incluidas las genéricas), clases abstractas (abstract class), y delegadas (delegate)

  3. ¿Es genérico?  

        El atributo Type.IsGenericType puede determinar si una clase o delegado es un tipo genérico.

        El atributo Type.IsGenericTypeDefinition puede determinar si Type es un tipo genérico de un tipo de parámetro independiente.

        El atributo Type.IsConstructedGenericType determina si este tipo puede crear una instancia genérica.

  4. Modificadores de acceso

        Type.IsPublic Determina si el tipo es público.

        Tipo.IsNotPublic

  5. Clase sellada, tipo estático, clase abstracta

        Type.IsSealed Determina si el tipo es una clase sellada y las clases selladas no se pueden heredar.

        IsAbstract indica si el tipo es un tipo abstracto

  6. Tipos de valor

        Type.IsValueType juzga si un Type es un tipo de valor, y los tipos de valores simples, las estructuras y las enumeraciones cumplen todos los requisitos.

        Type.IsEnum determina si el tipo es una enumeración

        Type.IsPrimitive Determina si Type es un tipo básico

  7. Interfaz

        Type.IsInterface determina si el tipo es una interfaz

  8. matriz

        IsArray Determina si el tipo es una matriz y GetArrayRank() obtiene la dimensión de la matriz.

Analizar la estructura de miembros de tipo de la clase Type

Una clase consta de uno o más de los siguientes miembros:

tipo de miembro ilustrar
PropertyInfo Escriba la información del atributo
información de campo Escriba la información del campo
ConstructorInfo escriba la información del constructor
Información del método tipo de método
Información de parámetros Parámetros de constructor o método
Información del evento Tipo de evento

C. Métodos de la clase Type

public class MySqlHelper
    {
        public MySqlHelper()
        {
            Console.WriteLine("{0}被构造", this.GetType().Name);
        }


        public void Query()
        {
            Console.WriteLine("{0}.Query", this.GetType().Name);
        }
    }

        GetConstructor(), GetConstructors(): devuelve el tipo ConstructorInfo, utilizado para obtener información sobre el constructor de esta clase

MySqlHelper dBHelper = new MySqlHelper();
Type type = dBHelper.GetType();
ConstructorInfo[] constructorInfos= type.GetConstructors();
foreach (var item in constructorInfos)
{
    ParameterInfo[] parameterInfos = item.GetParameters();
    foreach (var info in parameterInfos)
    {
           Console.WriteLine("查看:" + info.ParameterType.ToString() + "  " + info.Name);
    }
}

        GetEvent(), GetEvents(): Retorna el tipo EventInfo, usado para obtener información sobre eventos de esta clase

        GetField(), GetFields(): Retorna el tipo FieldInfo, usado para obtener información sobre los campos (variables miembro) de esta clase

        MySqlHelper nc = new MySqlHelper();
        Type t = nc.GetType();
        FieldInfo[] fis = t.GetFields();
        foreach (FieldInfo fi in fis)
        {
            Console.WriteLine(fi.Name);
        } 

        GetInterface(), GetInterfaces(): Devuelve el tipo InterfaceInfo, utilizado para obtener información sobre la interfaz implementada por la clase

        GetMember(), GetMembers(): devuelve el tipo MemberInfo, utilizado para obtener información sobre todos los miembros de la clase

            string n = "i3yuan";
            Type t = n.GetType();
            foreach (MemberInfo mi in t.GetMembers())
            {
                Console.WriteLine("{0}/t{1}",mi.MemberType,mi.Name);
            }

        GetMethod(), GetMethods(): Devuelve el tipo MethodInfo, usado para obtener información sobre los métodos de esta clase

        MySqlHelper dBHelper= new MySqlHelper();
        Type t = dBHelper.GetType();
        MethodInfo[] mis = t.GetMethods();
        foreach (MethodInfo mi in mis)
        {
            Console.WriteLine(mi.ReturnType+" "+mi.Name);
        }

        GetProperty(), GetProperties(): Devuelve el tipo PropertyInfo, usado para obtener información sobre las propiedades de esta clase

        MySqlHelper dBHelper= new MySqlHelper();
        Type t = dBHelper.GetType();
        PropertyInfo[] pis = t.GetProperties();
        foreach(PropertyInfo pi in pis)
        {
            Console.WriteLine(pi.Name);
        }

  Estos miembros se pueden invocar llamando al método InvokeMember() de Type o llamando al método Invoke() de MethodInfo, PropertyInfo y otras clases. 

  Use la reflexión para generar objetos y llame a propiedades, métodos y campos para operaciones 

        //获取类型信息
        MySqlHelper dbHelper=new MySqlHelper();
        Type type=dbHelper.GetType
        //创建对象实例化
        object DbHelper = Activator.CreateInstance(type);
        //类型转换
        IDBHelper iDBHelper = (IDBHelper)DbHelper;
        //方法调用
        iDBHelper.Query();  

Dos, clase System.Reflection.Assembly

   La clase Assembly puede obtener información de ensamblado, cargar dinámicamente el ensamblado, buscar información de tipo en el ensamblado y crear una instancia de ese tipo. El uso de la clase Assembly puede reducir el acoplamiento entre ensamblajes, lo que conduce a la racionalización de la estructura del software.

 1. Sistema.Reflexión 

Se utiliza para acceder a información sobre un ensamblado determinado o para cargar este ensamblado en un programa. Puede leer y usar metadatos

Proceso de llamada de método:

1. Cargar DLL 2. Obtener información de tipo 3. Crear tipo de objeto 4. Conversión de tipo 5. Llamada de método

Assembly assembly = Assembly.Load("Yuan.DB.MySql");//dll名称无后缀  从当前目录加载  1 加载dll
/完整路径的加载  可以是别的目录   加载不会错,但是如果没有依赖项,使用的时候会错
Type type = assembly.GetType("Yuan.DB.MySql.MySqlHelper");//2 获取类型信息
object oDBHelper = Activator.CreateInstance(type);//3 创建对象
//oDBHelper.Query();//oDBHelper是objec不能调用,但实际上方法是有的   编译器不认可  
IDBHelper iDBHelper = (IDBHelper)oDBHelper;//4 类型转换
iDBHelper.Query();//5 方法调用

Método 2: Reflexión a través del nombre de la asamblea

Assembly assembly = Assembly.Load("Yuan.DB.MySql");//dll名称无后缀  从当前目录加载  1 加载dll
               
Type type = assembly.GetType("Yuan.DB.MySql.MySqlHelper");//2 获取类型信息

object oDBHelper = Activator.CreateInstance(type);//3 创建对象
MethodInfo mi=oDBHelper.GetMethod("Query"); //获取方法
mi.Invoke(oDBHelper,null);//5 调用

Supongo que te gusta

Origin blog.csdn.net/ttod/article/details/130279648
Recomendado
Clasificación