【问题标题】:How can I call method that has a delegate parameter using reflection?如何使用反射调用具有委托参数的方法?
【发布时间】:2016-10-06 14:23:01
【问题描述】:

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

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

【问题讨论】:

  • 这是一个不同的问题,因为它有一个委托参数。
  • 你说得对,这已经足够不同了。而且我没有看到明显的重复。
  • 你的代理应该返回 JSValue,而不是动态

标签: c# .net reflection delegates


【解决方案1】:

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

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

【讨论】:

  • 但是我想反映的委托类型是JavascriptMethodHandler。
  • @Tempeck 好吧,它与方法的签名不匹配,所以你不能。如果你真的想要,你可以使用包装函数来“翻译”这两者,但要小心 - dynamic 有点传染性:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-13
  • 2019-03-03
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多