Я унаследовал небольшой язык сценариев и пытаюсь перенести его на 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 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, так как кажется, что требуется вызывать только "member", а не основание.
Я не знаю тип времени выполнения $ config, это просто какой-то объект, который реализует функцию с именем GetDBConnection (string). Это не обеспечивается интерфейсом или базовым классом.
Любая помощь будет оценена.