Как я могу разобрать лямбда-выбор?
Я используюDynamicExpressionParser
но мне нужно проанализировать метод. Вот код:
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;
using System.Text.RegularExpressions;
var categories = new List<Dictionary<string, object>>
{
new() {{"id", 1}, {"name", "Food"}},
new() {{"id", 2}, {"name", "Drink"}},
new() {{"id", 3}, {"name", "Snack"}}
};
var dict = new Dictionary<string, object> {{"categories", categories}};
// var codeToGetFirstCategoryName = "Category Name: ${categories[0][\"name\"]}"; // This is working
var codeToGetNames = "Category Names: ${string.Join(\", \", categories.Select(x => x[\"name\"]))}";
var result = StringHelper.Interpolate(codeToGetNames, dict);
Console.WriteLine(result);
public static class StringHelper
{
public static string Interpolate(string text, Dictionary<string, object> row, string pattern = @"\$\{(?<key>[^{}]*)\}")
{
return Regex.Replace(text, pattern, match =>
{
var parameterExpressions = row.Select(column => Expression.Parameter(column.Value.GetType(), column.Key));
var lambdaExpression = DynamicExpressionParser.ParseLambda(parameterExpressions.ToArray(), typeof(object), match.Groups["key"].Value, row.Values.ToArray());
return lambdaExpression.Compile().DynamicInvoke(row.Values.ToArray())?.ToString() ?? string.Empty;
});
}
}
Это возвращает следующее сообщение:
Необработанное исключение. ')' или ',' ожидается (по индексу 38)
Как я могу справитьсяSelect
? Или совершенно другое решение, кроме использования анализатора динамических выражений?
Спасибо.
1 ответ
Вы можете использовать пакет , где вы можете использовать string.Join и подобные методы. Пример в соответствии с кодами вашего проекта приведен ниже:
public static string Interpolate(string text, Dictionary<string, object> row, string pattern = @"\$\{(?<key>[^{}]*)\}")
{
return Regex.Replace(text, pattern, match =>
{
//Expression is taken
var expression = match.Groups["key"].Value;
//The expression and parameters are sent to the eval method.
return Eval.Execute<string>(expression, row);
});
}
Вы можете проверить пакет Z.Expressions.EvalZ.Expressions.Eval для получения подробной информации о библиотеке.