Created
June 7, 2014 19:31
-
-
Save Fhernd/a0a6a76db27ab3b33b15 to your computer and use it in GitHub Desktop.
Demostración del uso del método InvokeMember de Type en C#.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Reflection; | |
namespace Recetas.Cap03 | |
{ | |
// Declaración de clase con diferentes tipos de miembros: | |
public class ClaseDemo | |
{ | |
// Campos: | |
private int campo; | |
// Propiedades: | |
public int Propiedad | |
{ | |
get | |
{ | |
return campo; | |
} | |
set | |
{ | |
campo = value; | |
} | |
} | |
// Constructor: | |
public ClaseDemo (ref int x) | |
{ | |
x *= 5; | |
} | |
// método `ToString` sobrescrito: | |
public override String ToString() | |
{ | |
return campo.ToString(); | |
} | |
} | |
public sealed class UsoInvokeMember | |
{ | |
public static void Main() | |
{ | |
// Representación `Type` de `ClaseDemo`: | |
Type tipo = typeof (ClaseDemo); | |
// Arreglo con argumentos: | |
Object[] args = new Object[] {8}; | |
Console.WriteLine ("\n === Creación de una instancia de `{0}` === \n", tipo.Name.ToString()); | |
Console.WriteLine ("\tValor del elemento en la posición 0 de `args` antes de crear una instancia: {0}", args[0]); | |
// Crea un instancia `ClaseDemo`: | |
Object obj = tipo.InvokeMember( null, | |
BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Public | | |
BindingFlags.Instance | BindingFlags.CreateInstance, null, null, args | |
); | |
Console.WriteLine ("\n\tTipo en `obj`: {0}", obj.GetType().ToString()); | |
Console.WriteLine ("\tValor del elemento en la posición 0 de `args` después de crear una instancia: {0}", args[0]); | |
// Escribe un valor para el campo `campo`, lo lee y lo almacena en la | |
// variable int `valor`: | |
Console.WriteLine ("\n\n === Escritura y Lectura del campo `campo` de `{0}` === \n", tipo.Name.ToString()); | |
tipo.InvokeMember("campo", | |
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | | |
BindingFlags.Instance | BindingFlags.SetField, null, obj, new Object[] {5} | |
); | |
int valor = (int) tipo.InvokeMember("campo", | |
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | | |
BindingFlags.Instance | BindingFlags.GetField, null, obj, null | |
); | |
Console.WriteLine ("\tValor de `campo`: {0}", valor.ToString()); | |
// Invoca al método `ToString` y guarda el valor de retorno en `cadena`: | |
Console.WriteLine ("\n\n === Lectura del campo `campo` de `{0}` === \n", tipo.Name.ToString()); | |
String cadena = (String) tipo.InvokeMember ("ToString", | |
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | | |
BindingFlags.Instance | BindingFlags.InvokeMethod, null, obj, null | |
); | |
// Muestra el resultado de la invocación: | |
Console.WriteLine ("\tLlamada a `ToString` sobre `obj`: {0}", cadena); | |
// Establece y recupera un valor de la propiedad `Propiedad`: | |
Console.WriteLine ("\n\n === Establecimiento y recuperación de valor la propiedad `Propiedad` de `{0}` === \n", tipo.Name.ToString()); | |
tipo.InvokeMember ("Propiedad", | |
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | | |
BindingFlags.Instance | BindingFlags.SetProperty, null, obj, new Object[] {2} | |
); | |
valor = (int) tipo.InvokeMember ("Propiedad", | |
BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic | | |
BindingFlags.Instance | BindingFlags.GetProperty, null, obj, null | |
); | |
Console.WriteLine ("\tValor de `Propiedad`: {0}\n", valor.ToString()); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment