专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »DotNet » 表达式计算器:在C#中利用反射计算字符表达式 »正文

表达式计算器:在C#中利用反射计算字符表达式

来源: 发布时间:星期五, 2009年1月9日 浏览:18次 评论:0
  今天在论坛里面逛发现个问题比较典型,我们在使用js时候可以直接使用Eval得到某个表达式值,在C#里面可以吗?答案是肯定,在.NET提供丰富类库里面这是可以实现,但是没有js那么简单下面我将使用个简单例子来介绍说明利用编译器和反射得到串表达式值.我们建立个Windows窗体里面有如下思路方法:

  引用下命名空间:

  using ;

  using .Text;

  using .CodeDom.Compiler;

  using .Reflection;

  using .IO;

  using Microsoft.CSharp;

  命名空间具体意义就不说了,下面看看代码,为了可以让我们工程可以重复使用我们新建个类库工程名叫:CoustomEval其中有个类是用来计算某值.详细代码如下所示:

CoustomEval
{
  ///
  /// Summary description for Class1.
  ///
  public MyEval
  {
    public MyEval( )
    {
      //
      // TODO: Add constructor logic here
      //
    }
    
    public object Eval( cCharpCode )
    {
      CSharpCodeProvider csharpCodeProvider = CSharpCodeProvider( );
      ICodeCompiler compiler = csharpCodeProvider.CreateCompiler( );
      CompilerParameters cp = CompilerParameters( );
      cp.ReferencedAssemblies.Add( "system.dll" );
      cp.CompilerOptions = "/t:library";
      cp.GenerateInMemory = true;
      StringBuilder myCode = StringBuilder( );
      myCode.Append( "using ;
      " );
      myCode.Append( " CoustomEval
      {
        " );
        myCode.Append( " myLib
        {
          private "+cCharpCode+"
          public
           myMethod( )
          {
             i;
          }
        }
        " );
        myCode.Append( "
      }
      " );
      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 );
       result;
    }
  }
}


  上面类库只具有般代表性不具备般使用性,重要是提供种思路方法来实现它,所以我在里面使用了硬编码方式,如果你喜欢可以使用其他方式,包括读文件,读数据库取得代码段等等.然后我们在建立个测试工程,该工程里面有个测试窗体,该窗体上有个按钮和两个文本框,其中个文文本框用来输入要计算值,另个显示计算结果,详细代码如下:

private void button1_Click( object sender, .EventArgs e )
{
  MyEval eval = MyEval( );
  object result = eval.Eval( this.textBox1.Text );
  
  this.textBox2.Text = result.( );
}


  在这个工程中需要引用上面工程,这样我们就可以使用MyEval类来实现计算TextBox1里面值了,最后可以将值显示在TextBox2里面,代码运行结果我在这里就不帖了.只给出我测试结果,由于该问题源于论坛所以我就是用论坛中原来测试要求.

  测试结果:在TextBox中输入

   i = 10;

  点击Button1以后将会在TextBox2中显示出10.

  当然你可以使用更复杂计算表达式!这里是为了给您指出实现该功能做法,至于实现复杂程度读者可以自己决定?

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: