Метод Parse выдает исключение - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь использовать метод Parse, доступный в библиотеке System.Linq.Dynami c. Когда я выполняю следующий простой пример,

using Microsoft.Data.SqlClient;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic;
using System.Linq.Expressions;

namespace DynamicLINQDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            ParameterExpression x = Expression.Parameter(typeof(int), "x");
            ParameterExpression y = Expression.Parameter(typeof(int), "y");

            Dictionary<string, ParameterExpression> symbols = new Dictionary<string, ParameterExpression>();

            symbols.Add("x", x);
            symbols.Add("y", y);

            Expression body = System.Linq.Dynamic.DynamicExpression.Parse(null, "(x + y) * 2", symbols);

            LambdaExpression e = Expression.Lambda(body, new ParameterExpression[] { x, y });

            var c = e.Compile();
            var result = c.DynamicInvoke(1, 2);

            Console.WriteLine(result);
        }
    }
}

, выдается следующее исключение.

System.TypeInitializationException: 'The type initializer for 'System.Linq.Dynamic.ExpressionParser' threw an exception.

InnerException
FileNotFoundException: Could not load file or assembly 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089'. The system cannot find the file specified.

enter image description here Есть идеи, что я делаю неправильно?

1 Ответ

1 голос
/ 27 апреля 2020

Вы можете использовать System.Linq.Dynamic в основном проекте. net.

Удалите его и используйте вместо него System.Linq.Dynamic.Core.

Вот пример базовой версии Методы ParseLambda

using System;
using System.Linq.Dynamic.Core;
using System.Linq.Expressions;

namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            ParameterExpression x = Expression.Parameter(typeof(int), "x");
            ParameterExpression y = Expression.Parameter(typeof(int), "y");
            LambdaExpression e = DynamicExpressionParser.ParseLambda(new ParameterExpression[] { x, y }, null, "(x + y) * 2");

            var c = e.Compile();
            var result = c.DynamicInvoke(1, 2);

            Console.WriteLine(result);
        }
    }
}

Также пример использования ExpressionParser


using System;
using System.Linq.Dynamic.Core;
using System.Linq.Dynamic.Core.Parser;
using System.Linq.Expressions;


namespace ConsoleApp2
{
    class Program
    {
        static void Main(string[] args)
        {
            ParameterExpression x = Expression.Parameter(typeof(int), "x");
            ParameterExpression y = Expression.Parameter(typeof(int), "y");

            var symbols = new[] { x, y };

            Expression body = new ExpressionParser(symbols, "(x + y) * 2", symbols, new ParsingConfig()).Parse(typeof(int));

            LambdaExpression e = Expression.Lambda(body, new ParameterExpression[] { x, y });

            var c = e.Compile();
            var result = c.DynamicInvoke(1, 2);

            Console.WriteLine(result);
        }
    }
}

...