这是原始问题的简化版本.
我有一个名为Person的类:
public class Person {
public string Name { get; set; }
public int Age { get; set; }
public int Weight { get; set; }
public DateTime FavouriteDay { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......然后说一个例子:
var bob = new Person {
Name = "Bob",
Age = 30,
Weight = 213,
FavouriteDay = '1/1/2000'
}
Run Code Online (Sandbox Code Playgroud)
我想在我最喜欢的文本编辑器中将以下内容写成字符串 ....
(Person.Age > 3 AND Person.Weight > 50) OR Person.Age < 3
Run Code Online (Sandbox Code Playgroud)
我想取这个字符串和我的对象实例并评估一个TRUE或FALSE - 即在对象实例上评估一个Func <Person,bool>.
这是我目前的想法:
我正在为VBA中的数组寻找合适的排序实现.Quicksort将是首选.或任何其他排序算法除了冒泡或合并之外的就足够了.
请注意,这是为了与MS Project 2003一起使用,因此应避免使用任何Excel本机函数和任何.net相关的函数.
我正在尝试使用我在这里找到的示例代码来处理我正在处理的事情: 如何将String转换为其等效的LINQ表达式树?
在解决方案中,作者使用以下内容:
var e = DynamicExpression.ParseLambda(new[] { p }, null, exp);
Run Code Online (Sandbox Code Playgroud)
但是,每当我尝试使用它时,它都无法解决.我收到一个错误:
System.Linq.Expressions.DynamicExpression'不包含'ParseLambda'的定义
我在项目中安装了System Linq Dynamic nuget包,我还添加了一个using语句:
using System.Linq.Dynamic;
Run Code Online (Sandbox Code Playgroud)
然而,这看起来是灰色的所以我猜它没有发现我所指的DynamicExpression对象来自那里,而是从System.Linq.Expression中取而代之.有没有办法来解决这个问题?我试过去做
System.Linq.Dynamic.ParseLambda(new[] { p }, null, tagCondition);
Run Code Online (Sandbox Code Playgroud)
但仍然没有好,相同的错误和使用声明仍然是灰色的.
我想使用表达式树动态创建一个方法来调用lambda.第一次调用ComposeLambda函数时,以下代码运行正常,但第二次调用失败,并显示以下错误消息.
为调用方法'Int32 lambda_method(System.Runtime.CompilerServices.Closure,Int32)提供的参数数量不正确
{
Func<int, int> innerLambda = i => i + 1;
var composedLambda = ComposeLambda(innerLambda);
Console.WriteLine(composedLambda.DynamicInvoke(0));
var composedLambda2 = ComposeLambda(composedLambda);
Console.WriteLine(composedLambda2.DynamicInvoke(0));
}
private static Delegate ComposeLambda(Delegate innerLambda)
{
Func<int, int> outerLambda = i => i + 2;
var parameter = Expression.Parameter(typeof (int));
var callInner = Expression.Call(innerLambda.GetMethodInfo(), parameter);
var callOuter = Expression.Call(outerLambda.GetMethodInfo(), callInner);
var composedLambdaType = typeof (Func<,>).MakeGenericType(typeof (int), typeof (int));
var composedLambdaExpression = Expression.Lambda(composedLambdaType, callOuter, parameter);
var composedLambda = composedLambdaExpression.Compile();
return composedLambda;
}
Run Code Online (Sandbox Code Playgroud)
如何获取并传递此闭包对象?