在运行时动态创建回退委托

时间:2013-04-07 11:37:02

标签: c# reflection expression ironpython

我正在尝试设置C#代码,以便为IronPython脚本调用的方法自动创建虚拟或后备委托,但尚未明确实现。

假设有一个脚本调用非静态C#类方法“MoveTo”,它尚未在相应的类中实现。通常,如果它存在,则通过使用Method和委托实例的名称调用“SetVariable”来创建相应的委托实例,将其添加到脚本的作用域中。这适用于已经实现的方法。

如果该方法尚未实现,则调用不会失败,而是重定向到一个优雅处理调用并且假装成功执行的伪方法(在我的具体执行中被认为是不重要的)案件)。

问题是:IronPython脚本调用的方法有很多签名(实际上它们可以有任何可能的签名)。因此,我想动态创建一个后备委托,它获取被调用方法的相同签名,因此“捕获”每个调用尚未实现的方法。

你们对我如何实现这个目标有任何想法吗?

1 个答案:

答案 0 :(得分:0)

您应该能够创建一个包含任意数量/类型的args的catch-all方法:

object Fallback([ParamDictionary]IDictionary<object, object> kwargs, params object[] args) {
  return null; // or whatever
}

(可悲的是,这是从正常的Python编写类似函数的方式开始的:def foo(*args, **kwargs):。)

如果您不使用关键字args,则可以删除它,只需使用params

object Fallback(params object[] args) {
  return null; // or whatever
}

然后使用.SetVariable("whatever", Fallback)将其作为后备方法。