注意:数学表达式评估不是这个问题的焦点.我想在.NET中运行时编译和执行新代码. 话虽如此...
我想允许用户在文本框中输入任何等式,如下所示:
x = x / 2 * 0.07914
x = x^2 / 5
Run Code Online (Sandbox Code Playgroud)
并将该等式应用于传入的数据点.输入数据点由x表示,每个数据点由用户指定的等式处理.我多年前做过,但我不喜欢这个解决方案,因为它需要为每次计算解析等式的文本:
float ApplyEquation (string equation, float dataPoint)
{
// parse the equation string and figure out how to do the math
// lots of messy code here...
}
Run Code Online (Sandbox Code Playgroud)
当您处理大量数据点时,这会引入相当多的开销.我希望能够在飞行中将方程转换为函数,这样它只需要解析一次.它看起来像这样:
FunctionPointer foo = ConvertEquationToCode(equation);
....
x = foo(x); // I could then apply the equation to my incoming data like this
Run Code Online (Sandbox Code Playgroud)
函数ConvertEquationToCode将解析方程并返回指向应用适当数学的函数的指针.
该应用程序基本上是在运行时编写新代码.这可能与.NET有关吗?
我需要找到一个快速,轻量级的表达式解析器.
理想情况下,我想传递一个名称/值对列表(例如变量)和一个包含要评估的表达式的字符串.我需要的只是一个真/假值.
表达式的类型应该是:
varA == "xyz" and varB==123
Run Code Online (Sandbox Code Playgroud)
基本上,只是一个简单的逻辑引擎,其表达式在运行时提供.
更新
至少需要支持==,!=,>,> =,<,<=
关于速度,我希望每个请求大约执行5个表达式.我们会看到附近的某个地方/请求一秒钟.我们当前的页面往往在50ms以内执行.通常,任何表达式中只涉及2或3个变量.但是,我需要在执行之前将大约30加载到解析器中.
更新2012/11/5
有关性能的更新.我们近2年前实施了nCalc.从那以后,我们扩大了它的使用范围,使得我们在帖子背面平均覆盖300多个变量的40多个表达式.现在每秒发生数千次回发,性能严重下降.
我们还扩展了它,包括一些额外的功能,同样没有性能损失.简而言之,nCalc满足了我们的所有需求并超出了我们的预期.
我猜它既不调用csc.exe也不实现整个编译器,所以它是如何工作的?
更新:感谢Jon Skeet指向易于学习的代码.
string c = @"
public class A
{
public static void Main(string[] args)
{
System.Console.WriteLine(""hello world"");
}
}
";
CodeDomProvider compiler = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters();
parameters.WarningLevel = 4;
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
CompilerResults r = compiler.CompileAssemblyFromSource(parameters, c);
Assembly a = r.CompiledAssembly;
Type[] ts = a.GetTypes();
Type t = ts[0];
object o = t.GetMethod("Main").Invoke(null, new object[] { new string[] { } });
Run Code Online (Sandbox Code Playgroud) 我正在尝试将字典转换为匿名类型,每个键都有一个属性.
我尝试谷歌它,但我能找到的是如何将匿名对象转换为字典.
我的字典看起来像这样:
var dict = new Dictionary<string, string>
{
{"Id", "1"},
{"Title", "My title"},
{"Description", "Blah blah blah"},
};
Run Code Online (Sandbox Code Playgroud)
我想返回一个看起来像这样的匿名对象.
var o = new
{
Id = "1",
Title = "My title",
Description = "Blah blah blah"
};
Run Code Online (Sandbox Code Playgroud)
所以我希望它循环遍历字典中的每个keyValuePair并在对象中为每个键创建一个属性.
我不知道从哪里开始.
请帮忙.
是否可以将字符串表达式转换为布尔条件?
例如,我得到以下字符串:
var b = "32 < 45 && 32 > 20"
Run Code Online (Sandbox Code Playgroud)
我想创建一个bool表达式并调用它.字符串表示也很灵活(使其更有趣),因此它允许||, &&, ().
在我的WinForms应用程序中,我需要从我的WebBrowser控件调用javascript函数.我使用了Document.InvokeScript,它与单独的功能完美配合,例如
Document.InvokeScript("function").
Run Code Online (Sandbox Code Playgroud)
但是当我想调用javascript对象方法时,例如
Document.InvokeScript("obj.method")
Run Code Online (Sandbox Code Playgroud)
它不起作用.有没有办法让它发挥作用?或者解决这个问题的方法不同?不改变javascript代码中的任何内容!
提前致谢 :)
我可以编译,获取实例并调用任何C#类型programmaticaly的方法.有很多信息,包括StackOverflow(我如何动态评估C#表达式?).我的问题是我在Web环境中无法将任何内容保存到/ bin目录中.我可以编译"内存中",因为上面提到的链接建议,但后来我将无法从当前的AppDomain"卸载"我的自定义程序集.过了一会儿,这将成为一个巨大的记忆问题.是否可以打开一个新的AppDomain,编译新的程序集"内存中",评估一些表达式或访问该新程序集中的该程序集的某些成员并在完成时安全地终止该AppDomain,所有这些都不会保存到硬盘驱动器?提前感谢任何链接,建议等.
C#中动态代码评估的状态是什么?对于我正在开发的应用程序的一个非常高级的功能,我希望用户能够输入一行应该评估为布尔值的C#代码.
就像是:
DateTime.Now.Hours > 12 && DateTime.Now.Hours < 14
Run Code Online (Sandbox Code Playgroud)
我想动态评估此字符串并将结果捕获为布尔值.
我试过了Microsoft.JScript.Eval.JScriptEvaluate,这很有效,但它在技术上已被弃用,它只适用于Javascript(不理想,但可行).另外,我希望能够将对象推送到脚本引擎中,以便可以在评估中使用它们.
我发现提到的一些资源动态编译程序集,但这比我想要处理的更多开销.
那么,C#中动态脚本评估的状态是什么?有可能,还是我运气不好?
有没有办法计算字符串表达式的结果,例如
mystring = "2*a+32-Math.Sin(6)"动态地知道a是我拥有的变量,可能有一些动态解决方案或使用System.Reflection
string mystring = "2*a+32-Math.Sin(6)"`;
decimal result = SomeMethod(mystring,3); // where a = 3 for example
Run Code Online (Sandbox Code Playgroud) 是否可以转换字符串
"value > 5 && value <= 10"
Run Code Online (Sandbox Code Playgroud)
到if语句?
if (value > 5 && value <= 10)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
我有条件存储在数据库中的字符串,所以它必须是一个动态转换
如何评估表达.也许喜欢:
int a=1;
int b=3;
int c=Eval("a+b");
Run Code Online (Sandbox Code Playgroud)
要么
int c=int.parse("1+3*(2+3)");
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很愚蠢.在c#中有可能吗?
c# ×11
.net ×4
compilation ×2
asp.net-4.0 ×1
browser ×1
dictionary ×1
dynamic ×1
eval ×1
javascript ×1
linqpad ×1
object ×1
parsing ×1
reflection ×1
runtime ×1
winforms ×1