Skip to content

Instantly share code, notes, and snippets.

@mattwarren
Forked from leppie/Test.cs
Last active August 29, 2015 14:19
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 mattwarren/b0e49a45563d693419cd to your computer and use it in GitHub Desktop.
Save mattwarren/b0e49a45563d693419cd to your computer and use it in GitHub Desktop.
using System;
using System.Reflection.Emit;
class Program
{
delegate object FuncObjectObject(Object o);
static void Main(string[] args)
{
var dm = new DynamicMethod("", typeof(object), new [] { typeof(object) });
var ilgen = dm.GetILGenerator();
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Ret);
var dmd = (Func<object, object>)dm.CreateDelegate(typeof(Func<object, object>));
Console.WriteLine(dmd(1)); // works
// now do the same, but with reflection
var rd = (FuncObjectObject) Delegate.CreateDelegate(typeof(FuncObjectObject), dmd.Target, dmd.Method); // kaboom!
// wrap the delegate
var sdm = new FuncObjectObject(dmd);
Console.WriteLine(sdm(1)); // works
var srd = (FuncObjectObject)Delegate.CreateDelegate(typeof(FuncObjectObject), sdm.Target, sdm.Method); // works
Console.WriteLine(srd(1));
// lets try something else
var ad = (FuncObjectObject) Activator.CreateInstance(typeof(FuncObjectObject), dmd); // kaboom!
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment