传闻C#可以写类似于Oracle的动态执行,C# 2008高级编程有个例子 或许可以实现

解决方案 »

  1.   

    可以参考下 C#动态编译 http://hi.baidu.com/wfsoft/blog/item/2c302823bc71934c925807e8.html
      

  2.   

       字符串比较大小?
       if (string.Compare("2","18")>0 && string.Compare("100","12")>0)
      

  3.   

    string里面装的什么?
    你的意思是这样?bool a;
    string b = string.empty;
    a = (18>2 && 12>100);
    b = a.ToString();
      

  4.   

    return (18>2 && 12>100).ToString()返回一个为 "false" 的字符串
      

  5.   

    动态编译,上面已经有人给链接了
    LZ的意思就是
    string s="(18>2 && 12>100)"
    如何操作这个s,得到这个字符串所表达的逻辑的结果
      

  6.   

    using System;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
    using System.Text;
    using System.Reflection;namespace ADOGuy
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    public class Evaluator
    {
        #region Construction
    public Evaluator(EvaluatorItem[] items)
    {
          ConstructEvaluator(items);
    }    public Evaluator(Type returnType, string expression, string name)
        {
          EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };
          ConstructEvaluator(items);
        }    public Evaluator(EvaluatorItem item)
        {
          EvaluatorItem[] items = { item };
          ConstructEvaluator(items);
        }    private void ConstructEvaluator(EvaluatorItem[] items)
        {
          ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());
          CompilerParameters cp = new CompilerParameters();
          cp.ReferencedAssemblies.Add("system.dll");
          cp.ReferencedAssemblies.Add("system.data.dll");
          cp.ReferencedAssemblies.Add("system.xml.dll");
          cp.GenerateExecutable = false;
          cp.GenerateInMemory = true;      StringBuilder code = new StringBuilder();
          code.Append("using System; \n");
          code.Append("using System.Data; \n");
          code.Append("using System.Data.SqlClient; \n");
          code.Append("using System.Data.OleDb; \n");
          code.Append("using System.Xml; \n");
          code.Append("namespace ADOGuy { \n");
          code.Append("  public class _Evaluator { \n");
          foreach(EvaluatorItem item in items)
          {
            code.AppendFormat("    public {0} {1}() ", 
                              item.ReturnType.Name, 
                              item.Name);
            code.Append("{ ");
            code.AppendFormat("      return ({0}); ", item.Expression);
            code.Append("}\n");
          }
          code.Append("} }");      CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());
          if (cr.Errors.HasErrors)
          {
            StringBuilder error = new StringBuilder();
            error.Append("Error Compiling Expression: ");
            foreach (CompilerError err in cr.Errors)
            {
              error.AppendFormat("{0}\n", err.ErrorText);
            }
            throw new Exception("Error Compiling Expression: " + error.ToString());
          }
          Assembly a = cr.CompiledAssembly;
          _Compiled = a.CreateInstance("ADOGuy._Evaluator");
        }
        #endregion    #region Public Members
        public int EvaluateInt(string name)
        {
          return (int) Evaluate(name);
        }    public string EvaluateString(string name)
        {
          return (string) Evaluate(name);
        }    public bool EvaluateBool(string name)
        {
          return (bool) Evaluate(name);
        }
                                               //调用这个类的这个方法试试    public object Evaluate(string name)
        {
          MethodInfo mi = _Compiled.GetType().GetMethod(name);
          return mi.Invoke(_Compiled, null);
        }
        #endregion    #region Static Members
        static public int EvaluateToInteger(string code)
        {
          Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);
          return (int) eval.Evaluate(staticMethodName);
        }    static public string EvaluateToString(string code)
        {
          Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);
          return (string) eval.Evaluate(staticMethodName);
        }
        
        static public bool EvaluateToBool(string code)
        {
          Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);
          return (bool) eval.Evaluate(staticMethodName);
        }    static public object EvaluateToObject(string code)
        {
          Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);
          return eval.Evaluate(staticMethodName);
        }
        #endregion    #region Private
        const string staticMethodName = "__foo";
        Type _CompiledType = null;
        object _Compiled = null;
        #endregion
    }  public class EvaluatorItem
      {
        public EvaluatorItem(Type returnType, string expression, string name)
        {
          ReturnType = returnType;
          Expression = expression;
          Name = name;
        }    public Type ReturnType;
        public string Name;
        public string Expression;
      }
    }
      

  7.   

    动态编译LZ的意思就是 
    string s="(18>2 && 12>100)" 
    如何操作这个s,得到这个字符串所表达的逻辑的结果.可以使用.net里面的 CodeDom来实现。具体实现,你可以看MSDN或者google CodeDom
      

  8.   


    string str = 18>2 && 12>100 ? false : true
      

  9.   


    using System.CodeDom;
    using System.CodeDom.Compiler;
    using Microsoft.CSharp;
    using System.Reflection;        private void button1_Click(object sender, EventArgs e)
            {
                Text = GetValue("123<456 &&  1<2").ToString();
            }        public static object GetValue(string value)
            {
                string codeSnippet = "using System; " + "\r\n" +
                                     "namespace CzG {" + "\r\n" +
                                     " public class Eval" + "\r\n" +
                                     " {" + "\r\n" +
                                     "       public Eval(){} " + "\r\n" +
                                     "  public object GetValue()" + "\r\n" +
                                     "  {" + "\r\n" +
                                     "   return " + value + ";" + "\r\n" +
                                     "  }" + "\r\n" +
                                     " } }";            CodeSnippetCompileUnit unit = new CodeSnippetCompileUnit(codeSnippet);            ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();
                CompilerParameters para = new CompilerParameters();
                para.ReferencedAssemblies.Add("System.dll");
                para.GenerateInMemory = true;
                para.GenerateExecutable = false;
                para.OutputAssembly = "Eval.dll";            Assembly asm = compiler.CompileAssemblyFromDom(para, unit).CompiledAssembly;            Type type = asm.GetType("CzG.Eval");
                MethodInfo mi = type.GetMethod("GetValue", BindingFlags.Public | BindingFlags.Instance);            object obj = asm.CreateInstance("CzG.Eval");
                return mi.Invoke(obj, null);
            }
    参见 http://pcedu.pconline.com.cn/empolder/net/0412/523437.html
      

  10.   

    我这有个计算算术表达式的, 你拿去改一下, 改成比较运算符的就行了./*
     * 虚方法、重写方法和抽象方法示例之算术表达式建模
     */
    using System;
    using System.Collections;// 抽象类 Expression表示一个表达式树节点
    public abstract class Expression
    {
    //  Evaluate 方法用于计算给定的表达式的值
    public abstract double Evaluate(Hashtable vars);
    }
    // 派生类Constant实现了常量的表达式树节点
    public class Constant: Expression
    {
    double value;
    public Constant(double value)
    {
    this.value = value;
    }
    // Constant 的 Evaluate 实现只是返回所存储的常量
    public override double Evaluate(Hashtable vars)
    {
    return value;
    }
    }
    // 派生类VariableReference实现了变量引用的表达式树节点
    public class VariableReference: Expression
    {
    string name;
    public VariableReference(string name)
    {
    this.name = name;
    }
    // VariableReference 的实现在哈希表中查找变量名称,并返回产生的值
    public override double Evaluate(Hashtable vars)
    {
    object value = vars[name];
    if (value == null)
    {
    throw new Exception("Unknown variable: " + name);
    }
    return Convert.ToDouble(value);
    }
    }
    // 派生类Operation实现了算术运算的表达式树节点
    public class Operation: Expression
    {
    Expression left;
    char op;
    Expression right;
    public Operation(Expression left, char op, Expression right)
    {
    this.left = left;
    this.op = op;
    this.right = right;
    }
    // Operation 的实现先对左操作数和右操作数求值(通过递归调用它们的 Evaluate 方法),然后执行给定的算术运算
    public override double Evaluate(Hashtable vars)
    {
    double x = left.Evaluate(vars);
    double y = right.Evaluate(vars);
    switch (op)
    {
    case '+': return x + y;
    case '-': return x - y;
    case '*': return x * y;
    case '/': return x / y;
    }
    throw new Exception("Unknown operator");
    }
    }class Test
    {
    static void Main()
    {
    // 计算表达式 x * (y + 2) 的值
    Expression e = new Operation(new VariableReference("x"), '*',
    new Operation(new VariableReference("y"), '+', new Constant(2)));
    Hashtable vars = new Hashtable();
    vars["x"] = 3;
    vars["y"] = 5;
    Console.WriteLine(e.Evaluate(vars)); // Outputs "21"
    vars["x"] = 1.5;
    vars["y"] = 9;
    Console.WriteLine(e.Evaluate(vars)); // Outputs "16.5"
    }
    }
      

  11.   

    bool con = (18>2 && 12>100);这样就可以了     con就会是false值
      

  12.   

    办法1
            static public string runScriptControl(string s,string v)
            {
                try
                {
                    MSScriptControl.ScriptControl msc = new MSScriptControl.ScriptControlClass();
                    msc.UseSafeSubset = true;
                    msc.Language = "VBScript";                string strScript = "function test(value)\nif " + s + " then\ntest=1\nelse\ntest=0\nend if\nend function\n";
                    msc.AddCode(strScript);
                    object[] parameters = new object[] { v };
                    return msc.Run("test", ref parameters).ToString();
                }
                catch
                {
                    return "0";
                }
            }
    执行 runScriptControl("value>20 and value<50","30");
    好像要引用msscript.ocx这个是使用vbscript或javascript的办法2
    当然还可以使用sqlserver
    写 if (你的条件)
    select 1 as r
    else
    select 0 as r
    http://www.mybuffet.cn
      

  13.   


    应为string s="(18>2 && 12>100)"  弄个函数bool function(string ss)
    {
       bool result;
        ....
        
       return result;
    }resault1=function(s);
    resault1应该等于false如果string s="(18>2 && 12<100)" 
    resault1=function(s);
    resault1应该等于true楼主是这个意思吧?