您的位置:首页 > 编程语言 > C#

C#: 通过动态编译获取字符串所表达的值

2008-03-29 01:51 316 查看
到许多人经常问到这个问题: 怎么由字符串 “126 + (256 - 2^4 )”,或者怎么判断 “115 > 56 || 14<45”的结果等等,在MSDN上查了查,写了一个Eval类




/**//*****************************************************************


** 文件名: Eval.cs


** Copyright (c) 1999 -2003 


** 创建人: Phoenix


** 创建日期: 


** 修改人:


** 修改日期: 


** 描 述: 获取字符串所表示的逻辑意义


** 版 本:1.0


******************************************************************/




using System.CodeDom;


using System.CodeDom.Compiler;


using Microsoft.CSharp;


using System.Reflection;




public class Eval




...{


static object GetValue( string value )




...{


string codeSnippet = "using System; " + " " +


"namespace CzG {" + " " +


" public class Eval" + " " +


" {" + " " +


" public Eval(){} " + " " +


" public object GetValue()" + " " +


" {" + " " +


" return " + value + ";" + " " +


" }" + " " +


" } }";




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 );


}


}




------------------------------------------------------------------------



调用:

Console.WriteLine( Eval.GetValue(“125 -23” ) );
Console.WriteLine( Eval.GetValue(“125<23“ ) );

Output:
102
False

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息