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

时间:2016-10-06 14:23:02

标签: c# .net reflection delegates

如何使用反射调用以下方法?

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由类库引用。在运行时,我通过反射加载类库,并使用它在接口库中定义的方法。

1 个答案:

答案 0 :(得分:0)

问题在于你误解了CreateDelegate的第一个参数 - 它指的是代表的类型,而不是目标:

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