C# 字符串中的嵌套表达式
我正在使用VS 2015,C#,target framework 4.6.1来开发一种执行由最终用户创建并存储在数据库中的规则操作的方法。其思想是允许他们输入一个表示如下命令的字符串:C# 字符串中的嵌套表达式,c#,.net,expression,C#,.net,Expression,我正在使用VS 2015,C#,target framework 4.6.1来开发一种执行由最终用户创建并存储在数据库中的规则操作的方法。其思想是允许他们输入一个表示如下命令的字符串:comparedatesreentmorer(date1=>PushDate(//HEADER/ProcessDate,7,Sat:Sun,//START/Branch),date2=>SetToToday()) 通过解析输入,我可以很容易地得到ComparedatesReturnMorger方法名,但是如果存在嵌
comparedatesreentmorer(date1=>PushDate(//HEADER/ProcessDate,7,Sat:Sun,//START/Branch),date2=>SetToToday())
通过解析输入,我可以很容易地得到ComparedatesReturnMorger方法名,但是如果存在嵌套调用,则很难用适当的参数解析出所有的方法调用——这不是不可能的,但更难
我发现下面的方法可以工作——执行嵌套调用等——但我看不出如何从表示这些表达式的字符串到实际表达式
public string ExternalCall()
{
string result = string.Empty;
string input = "CompareDatesReturnGreaterFromFunc(date1 => PushDate(//HEADER/ProcessDate, 7, Sat: Sun, //START/Branch), date2 => SetToToday())";
List<string> commands = SplitCommand(input);
MethodInfo mi = this.GetType().GetMethod(commands[0], BindingFlags.Instance | BindingFlags.NonPublic);
List<object> miParams = new List<object>();
Expression<Func<string, string>> f1 = date1 => PushDate("//HEADER/ProcessDate", "7", "Sat: Sun", "//START/Branch");
miParams.Add(f1);
Expression<Func<string, string>> f2 = date1 => SetToToday();
miParams.Add(f2);
result = (string)mi.Invoke(this, miParams.ToArray());
return result;
}
公共字符串ExternalCall()
{
字符串结果=string.Empty;
string input=“CompareDatesReturnGreaterFromFunc(date1=>PushDate(//HEADER/ProcessDate,7,Sat:Sun,//START/Branch),date2=>setToToToDay())”;
列表命令=拆分命令(输入);
MethodInfo mi=this.GetType().GetMethod(命令[0],BindingFlags.Instance | BindingFlags.NonPublic);
List miParams=新列表();
表达式f1=date1=>PushDate(“//头/ProcessDate”、“7”、“Sat:Sun”、“//开始/分支”);
miParams.Add(f1);
表达式f2=date1=>SetToToToDay();
miParams.Add(f2);
result=(string)mi.Invoke(这是miParams.ToArray());
返回结果;
}
被调用的方法接受表达式并使用这些表达式创建MethodCallExpressions。这些用于调用最终方法以生成结果
public string CompareDatesReturnGreaterFromFunc(Expression<Func<string, string>> func1, Expression<Func<string, string>> func2)
{
string result = string.Empty;
MethodCallExpression operation1 = (MethodCallExpression)func1.Body;
string result1 = (string)Expression.Lambda(operation1).Compile().DynamicInvoke();
MethodCallExpression operation2 = (MethodCallExpression)func2.Body;
string result2 = (string)Expression.Lambda(operation2).Compile().DynamicInvoke();
result = CompareDates(result1, result2, true);
return result;
}
public string CompareDatesReturnGreaterFromFunc(表达式func1,表达式func2)
{
字符串结果=string.Empty;
MethodCallExpression操作1=(MethodCallExpression)func1.Body;
string result1=(string)Expression.Lambda(operation1.Compile().DynamicInvoke();
MethodCallExpression操作2=(MethodCallExpression)func2.Body;
string result2=(string)Expression.Lambda(operation2.Compile().DynamicInvoke();
结果=比较结果(结果1、结果2、真);
返回结果;
}
我找到了使用Roslyn软件包的建议,但无法将其正确安装到目标框架的VS 2015中
或者有没有更好的方法不用表达式就可以实现这一点?像编程语言一样解析一个对象是一项极其困难的任务。考虑一个更简单的非递归语法,例如提供固定数量的可替换宏。我同意,这就是为什么我希望避免这种情况。我更愿意弄清楚如何将调用的字符串表示形式转换为可以执行的表达式。也就是说,将字符串“date1=>PushDate(//HEADER/ProcessDate,7,Sat:Sun,//START/Branch)”转换为表达式f1=date1=>PushDate(//HEADER/ProcessDate”,“7”,“Sat:Sun”,“//START/Branch”);像编程语言一样解析语言是一项极其困难的任务。考虑一个更简单的非递归语法,例如提供固定数量的可替换宏。我同意,这就是为什么我希望避免这种情况。我更愿意弄清楚如何将调用的字符串表示形式转换为可以执行的表达式。也就是说,将字符串“date1=>PushDate(//HEADER/ProcessDate,7,Sat:Sun,//START/Branch)”转换为表达式f1=date1=>PushDate(//HEADER/ProcessDate”,“7”,“Sat:Sun”,“//START/Branch”);