现实需求是:客户通过在TextBox中输入一串复杂的条件,来满足过滤条件。如果用后台硬编译,代码是: string content=string.Empty;
            if (
                content.Contains("") && content.Contains("")
                && (
                   (
                      (content.Contains("") || content.Contains("")) && content.Contains("")
                    )
                    ||
                    (
                    (content.Contains("") || content.Contains("")) && content.Contains("")
                    )
                    ||
                    (
                    (content.Contains("") && content.Contains("")) || content.Contains("")
                    )
                   &&
                    (
                    (content.Contains("") || content.Contains("")) && content.Contains("")
                    )
                ))
            {
               //dosomething ;
            }由于“”的内容需要客户通过在UI界面中输入,不能硬编译,所以我想让用户自己输入C#表达式,但问题是传入的string不能像硬编一样编译,编译器只能把它们认为是字串,而不能是C#中的语法关键字。请问如何解决?谢谢大家

解决方案 »

  1.   

    string content=textbox.text 然后在去写你的条件 和处理方法
      

  2.   

    不是context是已知的,上面代码中临时用string.Empty代替,我的TextBox.text里需要输入if括号里的内容,想实现类似if(TextBox.text) {
                   //dosomething ;
                }
    的功能,但是TextBox.text是字符,不能运符出true or false
      

  3.   

    你这是脚本解析,google一下,有的
      

  4.   


    C#的动态编译,计算表达式的结果
    /// <summary>
    /// 采用动态编译,计算表达式的结果
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void button6_Click(object sender, EventArgs e)
    {
        // 声明要计算C#代码,要求必须完整的C#代码
        string strCode = @"
                        using System;
                        namespace ParseEx
                        {
                            public class ParseExC
                            {
                                public static double GetValue()
                                {
                                    return 1+5*8-(Math.Sin(12)*2.5);
                                }
                            }
                        }";    CodeDomProvider comp  = new CSharpCodeProvider();
        CompilerParameters cp = new CompilerParameters();                StringBuilder codeBuilder = new StringBuilder();            
        codeBuilder.AppendLine(strCode);    cp.ReferencedAssemblies.Add("System.dll");
        cp.GenerateExecutable = false;
        cp.GenerateInMemory   = true;
        
        CompilerResults cr = comp.CompileAssemblyFromSource(cp, codeBuilder.ToString());
        if (cr.Errors.HasErrors)
        {
            MessageBox.Show("Error!");
        }
        else
        {
            Assembly a = cr.CompiledAssembly;
            if (a != null)
            {
                Type t = a.GetType("ParseEx.ParseExC");
                if (t != null)
                {
                    // 因为是静态调用,不需要创建实例了
                    // object mode = a.CreateInstance("Mode");
                    MethodInfo mi = t.GetMethod("GetValue", BindingFlags.Static | BindingFlags.Public);
                    if (mi != null)
                    {
                        double d = (double)mi.Invoke(null, null);
                        MessageBox.Show(d.ToString());
                    }
                }
            }
        }
    }