1

我需要对这种情况进行定位。例如我有这个类:

public class Schema
{
   public string Value {get; set;}
}

在前端,用户将有机会输入该属性的值:

Schema.Value = [此处的表达式]

现在用户可以调用一个返回字符串的函数,或者他可以连接来自不同模式的值以将值分配给该特定模式值属性。

最好的方法是什么?我觉得这很难解释,但是如何保存该表达式(机制)然后在运行时计算它?

提前谢谢各位!

4

1 回答 1

1

您可以使用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.ReflectionSystem.CodeDom.Compiler命名空间。

您必须小心在表达式中公开了哪些类/方法,因为这可能是一个很大的安全问题。您可以添加自己的类、添加来自外部程序集的引用等,并且您无法控制正在执行的内容。

于 2013-04-24T23:38:01.257 回答