我有一个包含Jint引擎的通用函数框架(在JavaScript中提供C#函数用法)。 C#函数是这样注册的(LOG函数注册的例子):
private void RegisterUtils()
{
this.RegisterFunction("LOG", new Action<int, object>((level, message) =>
{
Logger.WriteLine(level, message);
}));
//....
}
/// <summary>
/// Register framework function.
/// </summary>
/// <param name="name"></param>
/// <param name="body"></param>
internal void RegisterFunction(string name, Delegate body)
{
this.JintEngine.SetValue(name, body);
}
我可以假设委托总是Action或Func。
我想在RegisterFunction中向逻辑添加逻辑(例如在上下文对象中保存名称)。
看起来委托有一个名为invokation list的东西。我试过这个:
Delegate.Combine(new Action(() => { /*logic here*/ }), body)
但得到了#34; ArgumentException:代理必须属于同一类型。&#34;使用该类型创建新委托需要具有与signarute匹配的功能,这是动态不可能的。
我已经看过其他问题,比如this,还有一个MSDN page谈论挂钩事件(在WinForms等等),但为此我需要抛出事件的类型(它似乎是一种真正的方法。
是否无法向委托本身添加简单的操作?或以某种方式包装它?