我需要对这种情况进行定位。例如我有这个类:
public class Schema
{
public string Value {get; set;}
}
在前端,用户将有机会输入该属性的值:
Schema.Value = [此处的表达式]
现在用户可以调用一个返回字符串的函数,或者他可以连接来自不同模式的值以将值分配给该特定模式值属性。
最好的方法是什么?我觉得这很难解释,但是如何保存该表达式(机制)然后在运行时计算它?
提前谢谢各位!
我需要对这种情况进行定位。例如我有这个类:
public class Schema
{
public string Value {get; set;}
}
在前端,用户将有机会输入该属性的值:
Schema.Value = [此处的表达式]
现在用户可以调用一个返回字符串的函数,或者他可以连接来自不同模式的值以将值分配给该特定模式值属性。
最好的方法是什么?我觉得这很难解释,但是如何保存该表达式(机制)然后在运行时计算它?
提前谢谢各位!
您可以使用CodeDomProvider
该类在运行时评估表达式,或使用CS-Script等脚本引擎。这是一个评估DateTime
表达式的简单测试:
[TestMethod]
public void ExecuteTest()
{
CodeDomProvider provider = provider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cp = new CompilerParameters();
cp.GenerateExecutable = false;
cp.GenerateInMemory = true;
cp.TreatWarningsAsErrors = false;
string source = @"using System; namespace N { public class C { public static DateTime Execute() { return DateTime.Now.AddDays(10); } } }";
CompilerResults cr = provider.CompileAssemblyFromSource(cp, source);
if(cr.Errors.Count > 0)
{
foreach(CompilerError ce in cr.Errors)
{
Console.Out.WriteLine(" {0}", ce.ToString());
}
Assert.Fail("Compilation error(s).");
}
else
{
object obj = cr.CompiledAssembly.CreateInstance("N.C");
MethodInfo mi = obj.GetType().GetMethod("Execute", BindingFlags.Public | BindingFlags.Static);
var actual = (DateTime)mi.Invoke(obj, null);
Assert.IsNotNull(actual);
var expected = DateTime.Now.AddDays(10).Date;
Assert.AreEqual(expected, actual.Date);
}
}
此代码需要反射来发现C
类和Execute
方法。您将需要导入System.Reflection
和System.CodeDom.Compiler
命名空间。
您必须小心在表达式中公开了哪些类/方法,因为这可能是一个很大的安全问题。您可以添加自己的类、添加来自外部程序集的引用等,并且您无法控制正在执行的内容。