用户要求:
如果算出的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%
10 个解决方案
#1
变得只是Y值的边界,还是说全变了?
#2
建议写在XML文档中 所有变化的条件在调用
#3
你把0,100%这两个当做变量不就好了嘛?!
#4
你从数据库里取出来用户的条件,然后解析这些条件,你的这些条件可以用XML保存,这样更规范一些,然后把解析出来的 不管是90% 还是100% ,作为一个变量在程序中使用
现在这种字符串的条件可以用正则表达式解析
现在这种字符串的条件可以用正则表达式解析
#5
估计有时变的是Y值的边界,有时是全变。
#6
调用c#的编译器 直接把你的条件 如0≤Y≤100编译成C#的语句 直接执行!
#7
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;
}
这样调用编译器可以直接把你取出的天骄字符串组合成函数 并执行 这样完全可以满足你的需求!
#8
我用的是.net1,应该从哪添加Microsoft.CSharp?
#9
我引用不了CSharpCodeProvider这个类
#10
用的开发工具出问题了。可以引用CSharpCodeProvider类。
问题解决了!
问题解决了!
#1
变得只是Y值的边界,还是说全变了?
#2
建议写在XML文档中 所有变化的条件在调用
#3
你把0,100%这两个当做变量不就好了嘛?!
#4
你从数据库里取出来用户的条件,然后解析这些条件,你的这些条件可以用XML保存,这样更规范一些,然后把解析出来的 不管是90% 还是100% ,作为一个变量在程序中使用
现在这种字符串的条件可以用正则表达式解析
现在这种字符串的条件可以用正则表达式解析
#5
估计有时变的是Y值的边界,有时是全变。
#6
调用c#的编译器 直接把你的条件 如0≤Y≤100编译成C#的语句 直接执行!
#7
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;
}
这样调用编译器可以直接把你取出的天骄字符串组合成函数 并执行 这样完全可以满足你的需求!
#8
我用的是.net1,应该从哪添加Microsoft.CSharp?
#9
我引用不了CSharpCodeProvider这个类
#10
用的开发工具出问题了。可以引用CSharpCodeProvider类。
问题解决了!
问题解决了!