我继承了一种小型脚本语言,并尝试将其移植到 DLR,以便更容易管理。到目前为止,一切都相当简单。我在尝试动态调用变量的成员时遇到了问题。当前的语言在 .NET 上运行,并使用解析循环和反射来执行此操作,但我希望摆脱这种情况。这是脚本语言的示例:
string $system1RemoteUri;
string $dbconnection = $config.GetDBConnection ("somedb");
float $minBad = 0.998;
float $minGood = 0.2;
$systen1RemoteURI、$minBad 和 $minGood 是将在脚本中与 $dbconnection 一起设置的变量。但是 $dbconnection 将从名为 $config 的变量中获取其值。这 4 个变量需要可供调用者使用,因此它们被传递到 lambda 中,最初为 null。这是生成的 Lambda IL(调试视图):
.Lambda #Lambda1<Delegate6$1>(
System.String& $$system1RemoteUri,
System.String& $$dbconnection,
System.Double& $$minBad,
System.Double& $$minGood
System.Object $$config) {
.Block() {
$$minBad = 0.998D;
$$minGood = 0.2D
}
//Some assignment similar to...
//.Dynamic Call GetDBConnection($config, "somedb");
}
我想弄清楚的是如何使用 Expression.Dynamic 发出 $config.GetDBConnection("somedb")。通过查看 Sympl 库中的示例,我相信发出的 IL 应该如下所示:
.Dynamic 调用 GetdbConnection($config, "somedb") 但我无法弄清楚如何从 Expression.Dynamic 实际发出它。
它似乎想要一个我无法正确创建的 CallSiteBinder,并且我不明白 Expression.Dynamic 的参数顺序是什么,因为它似乎只想要调用“成员”,而不是基础。
我不知道 $config 的运行时类型,它只是一些实现名为 GetDBConnection(string) 的函数的对象。这不是由接口或基类提供的。
任何帮助,将不胜感激。