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

也许你正在寻找这样的东西?如果您所说的未知是指任何:

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 回答