c # Tipo de reflexión y dos clases principales de ensamblaje

1, reflejando lo que es?

     La reflexión, la traducción al chino para la reflexión.

     Esta forma de realización es el tipo de información adquirida .Net tiempo de ejecución, .Net aplicaciones de varias partes: 'Asamblea (Asamblea)', 'módulo (Module1)', 'tipo (clase)' composición, y proporcionar una reflexión tipo de programación, lo que permite que el programador puede obtener información acerca de estos componentes en la ejecución del programa, por ejemplo:

 

     información Asamblea Clase conjunto se puede obtener está ejecutando, también puede cargar dinámicamente las asambleas, y para encontrar el tipo de información en el montaje y crea una instancia de ese tipo.

   Tipo de clase de tipo puede obtenerse a objeto de información, este objeto contiene todos los elementos de información: métodos, constructores, propiedades, etc., estos elementos se pueden obtener por la clase tipo de información, y la llama.

   El método que comprende información MethodInfo puede obtenerse a nombre del método, los parámetros de la clase, los valores de retorno, y se le puede llamar.

Y así sucesivamente, así como FieldInfo, EventInfo y así sucesivamente, estas clases se incluyen en el espacio de nombres System.Reflection.

 

   2, la relación entre espacios de nombres y conjuntos

   Muchas personas no conocen este concepto, para un programador .NET, es necesario averiguar estos conceptos.

   Espacio de nombres similar al paquete de Java (paquete), pero no es exactamente lo mismo, porque los paquetes de Java deben colocarse de acuerdo con la tabla de contenidos, y .NET no se necesita, sólo tiene que añadir una referencia a la línea relevante.

   Lo accesorio se instala? Literalmente no podía entender lo que está en C #, hablar popular, antes de la formación del .exe final o .dll, y esas cosas relacionadas no relacionados (por ejemplo, una gran cantidad de clases) para ser embalado en fardos ensamblados juntos, estas cosas se llaman montaje. Por supuesto, lo entendemos como un EXE y DLL directa.

   Relaciones de espacio de nombres de montaje no es uno a uno, ni tampoco es incluido en otra, un conjunto puede tener varios espacios de nombres, un espacio de nombres puede existir en más de encajar. Decimos tal vez no entendemos, sería dar un ejemplo:

 

Copiar el código

// conjunto A:

espacio de nombres N1

{

  AC1 public class {...}

  AC2 public class {...}

}

N2 espacio de nombres

{

  AC3 public class {...}

  CA4 public class {...}

}

// ajuste B:

espacio de nombres N1

{

  BC1 public class {...}

  BC2 public class {...}

}

N2 espacio de nombres

{

  BC3 public class {...}

  BC4 public class {...}

}

Copiar el código

   Los dos conjuntos tanto en espacio de nombres N1, N2, y cada declara dos clases, esto es totalmente posible, entonces conjunto A de referencia en una aplicación, entonces podemos ver en esta solicitud N1 es la clase AC1, AC2, N2 en la clase AC3, AC4.

   Si eliminamos la referencia a A, a continuación, a las referencias B de la Asamblea, que en esta aplicación, sólo podemos ver en la BC1 BC3 en N1, BC2, N2, BC4.

     Mientras que las referencias A, B, por supuesto, ser capaz de ver todas las categorías anteriores.

   Aquí, podemos entender el concepto de un espacio de nombres que sólo muestra una familia tipo, como algunas personas son chinos Han, alguien está musulmana, y el conjunto mostró que un tipo de vida, tales como alguien que vive en Pekín, estaba viviendo en Shanghai y luego en el pueblo Han de Beijing, hay personas Hui, la gente de Shanghai, Han chinos, sino también los musulmanes, esto no es contradictorio.

   Dijimos anteriormente, el conjunto es un tipo de lugar de residencia, a continuación, en un programa para ser utilizado en una clase, es necesario indicar al compilador que este niño viva clase, el compilador puede encontrarlo, que hay que hacer referencia al ensamblado.

     Así que si en la preparación de procedimientos, tal vez no sabe dónde esta clase, sólo sé su nombre, no se puede usar? La respuesta es sí, y esto se refleja, para proporcionar el tipo de dirección cuando el programa se está ejecutando, tratar de encontrarlo.

 

  3, en tiempo de ejecución información de tipo para conseguir lo es el uso

   Uno podría dudar, ya que en el desarrollo será capaz de escribir el código, ¿por qué sigue funcionando en, no sólo es engorroso, pero la eficiencia también se ve afectada.

Este es un tema de debate, al igual que la unión temprana y tardía de unión, aplicada a diferentes ocasiones. Algunas personas se oponen a finales de la unión, con el argumento de que la pérdida de eficiencia, pero mucha gente disfrutar de los beneficios de una función virtual trae el momento adecuado aún no se ha dado cuenta de que tenía que pasar una ligadura dinámica. Esta cuestión está abierta a, no son pocas las palabras pueden hablar con claridad, por lo que vamos más allá del.

   Mi opinión es, el enlace en tiempo puede traer una gran comodidad en el diseño, el uso adecuado puede mejorar en gran medida la capacidad de reutilización y flexibilidad del programa, pero todo tiene dos lados, en el momento adecuado para su uso, es necesario medir repetidamente.

 

  Se llegó a decir, información de tipo de tiempo de ejecución obtenido en el final ¿para qué sirve?

O darle un ejemplo para ilustrar que muchos desarrolladores de software como para dejar algunas de las interfaces en su software, otros pueden escribir algunos plug-ins para ampliar la funcionalidad del software, por ejemplo, tengo un reproductor de medios, y espero que podamos ampliar fácilmente formato reconocido, entonces declarar una interfaz:

IMediaFormat interfaz pública

{

cadena de Extensión {get;}

Decoder GetDecoder ();

}

 

  Esta interfaz contiene una propiedad de extensión que devuelve el apoyo a la extensión, y los otros devuelve el método un objeto decodificador (supongo que una clase Decoder, esta clase proporciona la funcionalidad de la decodificación secuencia de archivo, la extensión se pueden derivar ), mediante la decodificación del objeto que pueda explicar secuencia de archivo.

  Así que necesiten todos los tapón de decodificación debe derivar un decodificador, e implementar esta interfaz, el método devuelve GetDecoder objeto decodificador, y el nombre de su configuración tipo al perfil interior.

  En este caso, no necesito en el momento adecuado para desarrollar jugadores conocen el tipo de formato para una futura expansión, sólo de los tipos de archivos de configuración ahora obtienen los nombres de todos los decodificadores y formatos de medios de creación de objetos dinámicos, convertirlo a interfaz IMediaFormat para uso.

  Esto es un reflejo de una aplicación típica.

  4, el uso de algunas reflexiones

  El concepto básico de la reflexión es que algunos de los anteriores, que refleja lo que se utiliza?

  (1) adquirido por un tipo de reflexión

    La adquisición de método Hay dos tipos: uno es para dar la instancia de objeto

    Las veces que acaba de obtener esta instancia del objeto, el objeto puede ser una referencia a ponerse en el camino, tal vez una referencia a una interfaz, pero no conocer su tipo exacto, lo que necesito saber, entonces se puede llamar System.Object método GetType en el estado para obtener una instancia de un tipo de objeto de objeto, tal como en una forma, necesito para determinar si los parámetros pasados ​​en lograr un cierto interfaz, de realizarse, esta interfaz es una llamada de método:

    ...

   Proceso pública vacío (objeto processObj)

 

{

Tipo T = processsObj.GetType ();

si (t.GetInterface ( “ITest”)! = null)

   ...

}

...

Método A adicional para la adquisición de tipo y Assembly.GetType Type.GetType por métodos tales como:

      Tipo T = Type.GetType ( “System.String”);

   Cabe señalar que lo anterior hablamos acerca de la relación entre espacios de nombres y ensamblados, para encontrar una clase, se debe especificar que en la asamblea, o llamando al ejemplo GetType en la Asamblea se ha obtenido anteriormente.

   Este tipo de montaje puede escribir solamente escribir los nombres, otra excepción es mscorlib.dll, este tipo de montaje declarado en nombre de la asamblea se puede omitir (.Net asambleas tiempo de compilación, por defecto todas las referencias Mscorlib.dll, a menos explícitamente especificado en tiempo de compilación, no se refiere a él), como por ejemplo:

    System.String se declara en mscorlib.dll, por encima de tipo T = Type.GetType ( "System.String") es correcta

    System.Data.DataTable se declara en System.Data.dll, a continuación:

Type.GetType ( "System.Data.DataTable") sólo puede obtener una referencia nula.

    debe:

Tipo T = Type.GetType ( "System.Data.DataTable, System.Data, versión = 1.0.3300.0, Culture = neutral, PublicKeyToken = b77a5c561934e089");

(2) para atravesar el objeto a través de las propiedades de reflexión

Hay una clases de entidad de prueba:

Código A veces necesito atributo iterate (nombre y valor) o una prueba Soy un vago y que las clases de objetos y atributos de entidad particularmente grande, que puede ser utilizado de la siguiente manera:

Código también es a veces también puede obtener información sobre el navegador de esta manera:

Código (3) para crear dinámicamente objetos de acuerdo con el tipo de

Es la base de la fábrica abstracta, sino también la tecnología básica para lograr la fábrica abstracta a través de ella, puede crear dinámicamente un objeto que desee. Como el siguiente ejemplo se muestra cómo crear dinámicamente una instancia o EnglishName de onomástica china

 

using System;

usando System.Reflection;

espacio de nombres TestReflection

{

   clase ReflectionExample

    {

        public static void Main ()

        {

            nombre iname = AbstractFactory.GetName ();

            name.ShowName ();

        }

   }

 

   AbstractFactory clase pública

   {

       public static iname GetName ()

       {

           // valor de s después de adquirir dinámicamente desde el Web.config

           // asignado a los s: TestReflection.EnglishName, se mostrará el nombre Inglés

           string s = "TestReflection.ChineseName";

           nombre iname = (INAME) Assembly.Load ( "TestReflection") CreateInstance (s).;

           Nombre del retorno;

       }

   }

 

// declara una interfaz, que tiene un "nombre" indicador de funciones

INAME interfaz pública

{

Showname void ();

}

 

   // implementar la interfaz, mostrar nombre chino

   Onomástica china clase pública: el INAME

   {

       Showname public void ()

       {

           Console.WriteLine ( "!");

           Console.ReadLine ( "nombre chino");

       }

   }

 

   // implementar la interfaz, mostrar el nombre del Reino Unido

   EnglishName clase pública: el INAME

   {

       IName.ShowName vacío ()

       {

           Console.WriteLine ( "Nombre Enslish");

           Console.ReadLine ();

       }

   }

}

 

Publicados 224 artículos originales · elogios ganado 14 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/xulong5000/article/details/105143362
Recomendado
Clasificación