Разбираем лямбду в C#
Я хочу преобразовать строку, содержащую выражение известной подписи Func<dynamic, bool)
в динамическую функцию, которую я могу вызвать.
(x) => x.Age > 18 //Typecastable to Func<dynamic, bool>
var function = (Func<dynamic, bool>) Lamdba.Parse("(x) => x.Age > 18")
Я ищу эквивалент Lambda.Parse
Полный код того, что я пытаюсь достичь ниже:
using System;
using System.Dynamic;
using System.Collections.Generic;
public class DynamicModelTests
{
public static void Main()
{
//Illustration purpose... Working code
dynamic model = new ExpandoObject();
model.Age = 18;
Func<dynamic, bool> isAdultRule = (x) => x.Age >= 18;
IDictionary<string, object> dict = model;
dict["IsAdult"] = (Func<bool>) (() => isAdultRule(model));
Console.WriteLine($"Is Adult: {model.IsAdult()}");
//Working code ends
//Pseudo code starts... Pseudo only because it needs a working Lambda.Parse()
Compose(model, "IsAdult", "(x) => x.Age >= 18");
Compose(model, "CanWatchRRated", "(x) => x.IsAdult()");
bool isAdult = model.CanWatchRRated();
bool result = ExecuteByName(model, "CanWatchRRated");
Console.WriteLine($"Is Adult #2: {isAdult}");
Console.WriteLine($"Same as Is Adult #2: {result}");
//ends
}
public static void Compose(dynamic model, string ruleName, string expression)
{
var method = GetMethod(model, expression);
var ruleCallExpression = $"() => method(model)";
IDictionary<string, object> dict = model;
dict[ruleName] = (Action) method;
}
public static Func<dynamic, T> GetMethod<T>(dynamic model, string expression)
{
return Lambda.Parse<dynamic, T>(expression);
}
public static T Execute<T>(dynamic model, string expression)
{
return GetMethod(model, expression)(model);
}
//Should be called after compose... otherwise, throws MethodNotFound Exception
public static T ExecuteByName<T>(dynamic model, string ruleName)
{
IDictionary<string, object> dictionary = model;
if(!model.ContainsKey(ruleName))
{
throw new MethodNotFoundException();
}
return (T) model.Invoke(ruleName);
}
}
public class MethodNotFoundException : Exception
{
}
Есть ли готовый Lambda.Parse()
что я могу использовать?
Примечание № 1: модель должна быть типаdynamic
". Я использую библиотеку Рика Строля вместо того, чтобы кататься DynamicObject
реализация
Примечание № 2: Все примеры System.Linq.Dynamic.DynamicExpression
парсинг выражений работает только с известными типами. Они не работали на меня с типомdynamic
". Если это для вас, я весь слух.
Спасибо!