传闻C#可以写类似于Oracle的动态执行,C# 2008高级编程有个例子 或许可以实现
解决方案 »
- C#和C++对--处理的区别在哪里
- DataGridViewComboboxCell赋值问题
- Unicode文件转换为ASCII文件,求助大哥~
- 如何给datagridview控件某一列加上图片和数字?
- 我要用日志记录下来用户对数据库的增删改操作,该如何实现?
- ~~~~~~~~~~求助!!!
- 高手救我...
- 在datagrid中加入textbox,在页面中用户可以在textbox中输入数值,然后单击完成按钮的时候怎样可以取得textbox中输入的数值
- 今天去应聘软件测试职位,主管问我曾用过哪些.net方面的正规测式软件,讲讲这方面的经验,我无从答起,兄弟们如何答啊?????
- 怎么做一个像.net工具栏那样的悬浮框?
- 简单的编程
- 跪求答案!小弟急用
if (string.Compare("2","18")>0 && string.Compare("100","12")>0)
你的意思是这样?bool a;
string b = string.empty;
a = (18>2 && 12>100);
b = a.ToString();
LZ的意思就是
string s="(18>2 && 12>100)"
如何操作这个s,得到这个字符串所表达的逻辑的结果
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;
}
}
string s="(18>2 && 12>100)"
如何操作这个s,得到这个字符串所表达的逻辑的结果.可以使用.net里面的 CodeDom来实现。具体实现,你可以看MSDN或者google CodeDom
string str = 18>2 && 12>100 ? false : true
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
* 虚方法、重写方法和抽象方法示例之算术表达式建模
*/
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"
}
}
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
应为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楼主是这个意思吧?