如何使用反射调用具有委托参数的方法?

本文关键字:参数 方法 何使用 反射 调用 | 更新日期: 2023-09-27 18:11:57

如何使用反射调用下面的方法?

namespace Awesomium.Core
{
    public delegate JSValue JavascriptMethodHandler(object sender, JavascriptMethodEventArgs e);
    public class JSObject
    {
        public void Bind(string methodName, JavascriptMethodHandler handler)
        {
            // Does something...
        }
    }
}

我的进度如下。我在CreateDelegate上得到异常。

无法绑定到目标方法,因为其签名或安全透明度与委托类型的签名或安全透明度不兼容。

public class AwesomiumHelper
{
    private Func<object, dynamic, dynamic> JavascriptMethodHandlerAction;
    public void RegisterJavascriptMethodAndBind(string methodName, Func<object, dynamic, dynamic> func)
    {
        if (func != null)
        {
            var jsoType = AwesomiumCore.GetExportedTypes().First(f => f.Name == "JSObject");
            var jso = Activator.CreateInstance(jsoType);
            var t = AwesomiumCore.GetTypes().FirstOrDefault(f => f.Name == "JavascriptMethodHandler");
            var mi = typeof(AwesomiumHelper).GetMethod("JavascriptMethodHandlerProxy", BindingFlags.NonPublic | BindingFlags.Instance);
            // GETTING EXCEPTION HERE
            var d = Delegate.CreateDelegate(t, this, mi);
            // GETTING EXCEPTION HERE
            JavascriptMethodHandlerAction = func;
            var mi0 = jsoType.GetMethod("Bind", new[] { typeof(string), t });
            mi0.Invoke(jso, new object[] { methodName, d });
        }
    }
    private dynamic JavascriptMethodHandlerProxy(object sender, dynamic e)
    {
        return JavascriptMethodHandlerAction?.Invoke(sender, e);
    }
}

更新:我通过创建两个库解决了这个问题。接口库和类库。接口库由类库和主程序引用。Awesomium由类库引用。在运行时,我通过反射加载类库并使用接口库中定义的方法。

如何使用反射调用具有委托参数的方法?

问题是您误解了CreateDelegate的第一个参数-它指的是委托的类型,而不是目标:

var d = Delegate.CreateDelegate(typeof(Func<object, dynamic, dynamic>), this, mi);