2
このサンプルコードでは、il generatorから匿名アクションを呼び出そうとしています。私は、デリゲートへの参照とそれを呼び出す方法を読み込むことができるかどうか、また、どのように呼び出すことができるのか分かりません。 OnFunctionCall
が静的メソッドではないプロパティの場合は、私はそれを行うことができます。il generatorからアクション<string、bool>を呼び出す方法
public delegate void TestDelegate();
public static class ExampleOne
{
public static Action<string, bool> OnFunctionCall
=> (message, flag) => Console.WriteLine("Example");
}
public static class ExampleTwo
{
public static TType CreateDelegate<TType>(Action<string, bool> onFunctionCall)
where TType : class
{
var method = new DynamicMethod($"{Guid.NewGuid()}", typeof(void), Type.EmptyTypes, typeof(TType), true);
ILGenerator il = method.GetILGenerator();
// Emit some code that invoke unmanaged function ...
// loading the first string argument
il.Emit(OpCodes.Ldstr, method.Name);
// not sure here how to load boolean value to the stack
il.Emit(OpCodes.Ldc_I4_0);
// this line doesn't work
// example two has no idea about ExampleOne
// is it possible to load the reference of the Action<string, bool> to the stack and call it ?
il.Emit(OpCodes.Call, onFunctionCall.Method);
il.Emit(OpCodes.Ret);
return method.CreateDelegate(typeof(TestDelegate)) as TType;
}
}
public class Program
{
public static void Main(string[] args)
=> ExampleTwo
.CreateDelegate<TestDelegate>(ExampleOne.OnFunctionCall)
.Invoke();
}
Reflect EmitよりもCodeDOMを使用したほうが簡単です – MickyD
@MickyD例を提供できます – ptp
@MickyDこれもネット標準2.0と互換性があります – ptp