//比如我从文本文件读出一个串
string cmd= @"string[] flis = { ""类别"", ""供应商"", ""单位"" }";//想变成这样执行
string[] flis = { "类别", "供应商", "单位" };//在其他语言叫宏替换吧,好像C#不能这样,有没有变通的方法?
string cmd= @"string[] flis = { ""类别"", ""供应商"", ""单位"" }";//想变成这样执行
string[] flis = { "类别", "供应商", "单位" };//在其他语言叫宏替换吧,好像C#不能这样,有没有变通的方法?
在C#中利用反射计算字符表达式
详细如下:
今天在论坛里面逛发现一个问题比较典型,我们在使用js的时候可以直接使用Eval得到某一个表达式的值,在C#里面可以吗?答案是肯定的,在.NET提供的丰富的类库里面这是可以实现的,但是没有js那么简单下面我将使用一个简单的例子来说明利用编译器和反射得到一个字符串表达式的值。我们建立一个Windows窗体里面有如下的方法:引用一下命名空间:using System;using System.Text;using System.CodeDom.Compiler;using System.Reflection;using System.IO;using Microsoft.CSharp;命名空间的具体意义就不说了,下面看看代码,为了可以让我们的工程可以重复使用我们新建一个类库工程名叫:CoustomEval其中有一个类是用来计算某一断字符串的值。详细代码如下所示:namespace CoustomEval{/// /// Summary description for Class1./// public class MyEval{public MyEval(){//// TODO: Add constrUCtor logic here//}public 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;StringBuilder myCode = new StringBuilder();myCode.Append("using System;");myCode.Append("namespace CoustomEval{");myCode.Append("class myLib {private "+cCharpCode+" public int myMethod(){return i;}}");myCode.Append("}");CompilerResults cr = compiler.CompileAssemblyFromSource(cp,myCode.ToString());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;}}}上面的类库只具有一般代表性不具备一般使用性,重要的是提供一种方法来实现它,所以我在里面使用了硬编码的方式,如果你喜欢可以使用其他的方式,包括读文件,读数据库取得代码段等等。然后我们在建立一个测试工程,该工程里面有一个测试窗体,该窗体上有一个按钮和两个文本框,其中一个文文本框用来输入要计算的值,另一个显示计算的结果,详细代码如下:private void button1_Click(object sender, System.EventArgs e) {MyEval eval = new MyEval();object result = eval.Eval(this.textBox1.Text);this.textBox2.Text = result.ToString();}在这个工程中需要引用上面的工程,这样我们就可以使用MyEval类来实现计算TextBox1里面的值了,最后可以将值显示在TextBox2里面,代码运行的结果我在这里就不帖了。只给出我的测试结果,由于该问题源于论坛所以我就是用论坛中原来的测试要求。测试结果:在TextBox中输入int i = 10;点击Button1以后将会在TextBox2中显示出10。当然你可以使用更复杂的计算表达式!这里的目的是为了给您指出实现该功能的做法,至于实现的复杂程度读者可以自己决定。
eval("i*=4;");
alert(i); //i==8
c#本身没有eval,不过可以使用JScript的脚本解释引擎来实现eval,比CodeDom更高效,代码超级简单。先添加两个引用:Microsoft.JScript和Microsoft.Vsa。private void button2_Click(object sender, EventArgs e)
{
Microsoft.JScript.Vsa.VsaEngine eng = Microsoft.JScript.Vsa.VsaEngine.CreateEngine();
int n = (int)Microsoft.JScript.Eval.JScriptEvaluate("var i=2; i*4+7", eng);
MessageBox.Show(n.ToString()); //n==15
}
所以要计算表达式的话,这种方法比CodeDom速度更快,有心人可以去做测试的。不过语句里面的变量与c#里的变量似乎是不能交互的,CodeDom里能与变量交互,但是似乎也达不到楼主说的程度,可能是我对CodeDom没有什么理解吧。
http://topic.csdn.net/u/20080326/09/43b8ca63-c7f6-445f-9f8c-8ff7c1bb7798.html