当前位置:编程学习 > C#/ASP.NET >>

C# 如何 解析条件表达式

在RichEditBox中:

条件表达式类似这样

If sex='男'
  男性  
Else if sex='女'
  女性
End if

其中sex 为数据库表中的字段.

在界面中有一个按钮,名为 "解析"

点击"解析"按钮后的结果是:

在RichEditBox中显示 "男性" 或者  "女性".
原来的条件表达式被删除. --------------------编程问答-------------------- 也有更复杂的 :

If sex='男' AND age<18
  少年男性   
Else if sex='女'
  女性
End if


同样age为数据库中的字段。 --------------------编程问答-------------------- 直接删掉换行符,组成一个sql语句,从数据库按条件取结果。显示不就可以了? --------------------编程问答--------------------
引用 1 楼 stop__ 的回复:
也有更复杂的 :

If sex='男' AND age<18
  少年男性  
Else if sex='女'
  女性
End if


同样age为数据库中的字段。


如果上面就是最复杂的语句,你自己简单解析一下就OK了。。。

如果还有更复杂的,建议你是。Net的动态编译。。C#和VB都支持,看你的脚本更像VB的
动态编译可以将写好的C#代码或VB代码编译并运行且还能返回结果

看下面的例子,是c#的,你用VB更好

/// <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());
                }
            }
        }
    }
}
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,