3

ILGenerator.Emit (LambdaExpression.Compile ではなく) を使用して、未知のターゲットで呼び出される未知の MethodInfo を持つデリゲートを動的に作成するにはどうすればよいですか?

public void CreateDelegate(MethodInfo mi, object target, object[] arguments)
{
    var method = new DynamicMethod("Temp", typeof(void), Type.EmptyTypes);
    var generator = method.GetILGenerator();
    // Make the method call mi on target with arguments
    // ...
    method.CreateDelegate(typeof(Action));
}
4

1 に答える 1

1

多分あなたはこのようなものを見ていますか?Unknown とは Any を意味する場合:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;

namespace Platform.Reflection
{
    public static class DelegateHelpers
    {
        public static TDelegate CompileOrDefault<TDelegate>(Action<ILGenerator> emitCode)
            where TDelegate : Delegate
        {
            var @delegate = default(TDelegate);
            try
            {
                var delegateType = typeof(TDelegate);
                var invoke = delegateType.GetMethod("Invoke");
                var returnType = invoke.ReturnType;
                var parameterTypes = invoke.GetParameters().Select(s => s.ParameterType).ToArray();
                var dynamicMethod = new DynamicMethod(Guid.NewGuid().ToString(), returnType, parameterTypes);
                var generator = dynamicMethod.GetILGenerator();
                emitCode(generator);
                @delegate = (TDelegate)dynamicMethod.CreateDelegate(delegateType);
            }
            catch (Exception exception)
            {
                // ignore
            }
            return @delegate;
        }
    }
}

または、 Platform.Reflection (バージョン 0.1.0 以降) NuGet パッケージを参照することもできます。Platform.Reflection.DelegateHelpers を使用します。

于 2019-09-01T14:46:30.613 に答える