1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class Program
{
public delegate void OneArgDelegate(Test p);
static void Main(string[] args)
{
//On créé un objet Test
Test t = new Test();
t.Str = "Salut";
DynamicMethod dyn = new DynamicMethod(
"", //Methode sans nom
null, //Retour void
new Type[] { typeof(Test) }, //un argument (l'instance)
typeof(Test)); //On donne un type pour "l'etendre"
ILGenerator ilGen = dyn.GetILGenerator();
ilGen.Emit(OpCodes.Ldarg_0);
ilGen.Emit(OpCodes.Ldfld, typeof(Test).GetField("m_str",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic));
ilGen.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine",
new Type[]{typeof(object)}));
ilGen.Emit(OpCodes.Ret);
//On créé un delegué (plus rapide que l'invoke)
OneArgDelegate del = dyn.CreateDelegate(typeof(OneArgDelegate)) as OneArgDelegate;
del(t);
//On change la variable
t.Str = "Coucou";
del(t);
}
}
class Test
{
string m_str;
public string Str
{
get { return m_str; }
set { m_str = value; }
}
} |
Partager