, . , :
public delegate void SomethingHappenedEventHandler(object sender, object args);
public event SomethingHappenedEventHandler SomethingHappened;
public void DoSomethingElse(object a, object b)
{
Console.WriteLine("Yay! " + a + " " + b);
}
SomethingHappened += DoSomethingElse;
public void DoSomethingDifferent(object a)
{
Console.WriteLine("Yay! " + a);
}
SomethingHappened += (a, b) => DoSomethingDifferent(a);
, , , , DynamicMethod
. IL , Ldarg_0
Ldarg_1
, Ldarg_2
. , , - , this
:
public void CreateDynamicHandler()
{
var dynamicMethod = new DynamicMethod("DynamicMethod", null,
new[] { typeof(MyClass), typeof(object), typeof(object) }, typeof(MyClass));
var ilgen = dynamicMethod.GetILGenerator();
ilgen.Emit(OpCodes.Ldarg_0);
ilgen.Emit(OpCodes.Ldarg_1);
ilgen.Emit(OpCodes.Ldarg_2);
MethodInfo doSomethingElse = typeof(MyClass).GetMethod("DoSomethingElse",
new[] { typeof(object), typeof(object) });
ilgen.Emit(OpCodes.Call, doSomethingElse);
ilgen.Emit(OpCodes.Ret);
Delegate emitted = dynamicMethod.CreateDelegate(
typeof(Action<MyClass, string, string>));
emitted.DynamicInvoke(this, "Hello", "World");
}
"MyClass
" .
EDIT , , IL, . Reflection, :
public void DoSomething(object a, object b)
{
var method = GetType().GetMethod("DoSomethingElse", BindingFlags.Instance | BindingFlags.Public);
method.Invoke(this, new object[] { a, b });
}
public static void DoSomething(dynamic instance, object a, object b)
{
instance.DoSomethingElse(a, b);
}