Skip to content

Instantly share code, notes, and snippets.

@Fhernd
Created June 7, 2014 19:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Fhernd/a0a6a76db27ab3b33b15 to your computer and use it in GitHub Desktop.
Save Fhernd/a0a6a76db27ab3b33b15 to your computer and use it in GitHub Desktop.
Demostración del uso del método InvokeMember de Type en C#.
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