【发布时间】: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