程序现在已经算出Y、Z的值,下来要算g的值。
用户要求:
如果算出的Y<0,然后g=60%;
如果0≤Y≤100%,然后g=Y/Z;
如果Y>0,根据g=Y/Z算出的g≤100%,则g=90%
如果用户不改变要求就好办了,直接把上面的条件写到程序里。
但现在问题是用户可能某天会改变要求,也就是条件,比如:如果0≤Y≤90%,然后g=Y/Z。但是公式始终不变。像这种情况该怎么办?
已经把用户的要求保存到数据库里了。如:
条件 公式
Y<0 g=60%
0≤Y≤100% g=Y/Z
Y>0 && g≤100% g=90%
用户要求:
如果算出的Y<0,然后g=60%;
如果0≤Y≤100%,然后g=Y/Z;
如果Y>0,根据g=Y/Z算出的g≤100%,则g=90%
如果用户不改变要求就好办了,直接把上面的条件写到程序里。
但现在问题是用户可能某天会改变要求,也就是条件,比如:如果0≤Y≤90%,然后g=Y/Z。但是公式始终不变。像这种情况该怎么办?
已经把用户的要求保存到数据库里了。如:
条件 公式
Y<0 g=60%
0≤Y≤100% g=Y/Z
Y>0 && g≤100% g=90%
using System.CodeDom.Compiler;
using Microsoft.CSharp; private static object Eval( string cCharpCode )
{
CSharpCodeProvider csharpCodeProvider = new CSharpCodeProvider( );
ICodeCompiler compiler = csharpCodeProvider.CreateCompiler( );
CompilerParameters cp = new CompilerParameters( );
cp.ReferencedAssemblies.Add("system.dll" );
cp.CompilerOptions = "/t:library";
cp.GenerateInMemory = true;
string myCode =
"using System;"+ "namespace CoustomEval"+
"{"+
"class myLib"+
"{ "+
"private object expr = ("+cCharpCode+");"+
"public object myMethod()"+
"{"+
"return expr;"+
"}"+
"}"+
"}"; CompilerResults cr = compiler.CompileAssemblyFromSource( cp,myCode);
Assembly assembly = cr.CompiledAssembly;
object tmp = assembly.CreateInstance( "CoustomEval.myLib" );
Type type = tmp.GetType();
MethodInfo mi = type.GetMethod( "myMethod" );
object result = mi.Invoke( tmp,null );
return result;
}这样调用编译器可以直接把你取出的天骄字符串组合成函数 并执行 这样完全可以满足你的需求!
问题解决了!