解析方法抛出异常
Parse method throws an exception
我正在尝试使用 System.Linq.Dynamic 库中可用的 Parse 方法。当我执行以下简单示例时,
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.
知道我做错了什么吗?
您可以在 .net 核心项目中使用 System.Linq.Dynamic
。
Tyr 卸载它并改用 System.Linq.Dynamic.Core
。
核心版本的例子
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);
}
}
}
我正在尝试使用 System.Linq.Dynamic 库中可用的 Parse 方法。当我执行以下简单示例时,
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.
您可以在 .net 核心项目中使用 System.Linq.Dynamic
。
Tyr 卸载它并改用 System.Linq.Dynamic.Core
。
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);
}
}
}