Разбираем лямбду в 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". Если это для вас, я весь слух.

Спасибо!

0 ответов

Другие вопросы по тегам