當前位置:編程學習大全網 - 源碼下載 - 在C#winform裏可否有類似於asp中的eval,即將字符串轉為代碼的函數

在C#winform裏可否有類似於asp中的eval,即將字符串轉為代碼的函數

這是類

using System;

using System.Data;

using System.Configuration;

using System.Text;

using System.CodeDom.Compiler;

using Microsoft.CSharp;

using System.Reflection;

namespace EvalGuy

{

/// <summary>

/// 本類用來將字符串轉為可執行文本並執行

/// 從別處復制,勿隨意更改!

/// </summary>

public class Evaluator

{

#region 構造函數

/// <summary>

/// 可執行串的構造函數

/// </summary>

/// <param name="items">

/// 可執行字符串數組

/// </param>

public Evaluator(EvaluatorItem[] items)

{

ConstructEvaluator(items); //調用解析字符串構造函數進行解析

}

/// <summary>

/// 可執行串的構造函數

/// </summary>

/// <param name="returnType">返回值類型</param>

/// <param name="expression">執行表達式</param>

/// <param name="name">執行字符串名稱</param>

public Evaluator(Type returnType, string expression, string name)

{

//創建可執行字符串數組

EvaluatorItem[] items = { new EvaluatorItem(returnType, expression, name) };

ConstructEvaluator(items); //調用解析字符串構造函數進行解析

}

/// <summary>

/// 可執行串的構造函數

/// </summary>

/// <param name="item">可執行字符串項</param>

public Evaluator(EvaluatorItem item)

{

EvaluatorItem[] items = { item };//將可執行字符串項轉為可執行字符串項數組

ConstructEvaluator(items); //調用解析字符串構造函數進行解析

}

/// <summary>

/// 解析字符串構造函數

/// </summary>

/// <param name="items">待解析字符串數組</param>

private void ConstructEvaluator(EvaluatorItem[] items)

{

//創建C#編譯器實例

ICodeCompiler comp = (new CSharpCodeProvider().CreateCompiler());

//編譯器的傳入參數

CompilerParameters cp = new CompilerParameters();

cp.ReferencedAssemblies.Add("system.dll"); //添加程序集 system.dll 的引用

cp.ReferencedAssemblies.Add("system.data.dll"); //添加程序集 system.data.dll 的引用

cp.ReferencedAssemblies.Add("system.xml.dll"); //添加程序集 system.xml.dll 的引用

cp.GenerateExecutable = false; //不生成可執行文件

cp.GenerateInMemory = true; //在內存中運行

StringBuilder code = new StringBuilder(); //創建代碼串

/*

* 添加常見且必須的引用字符串

*/

code.Append("using System; \n");

code.Append("using System.Data; \n");

code.Append("using System.Data.SqlClient; \n");

code.Append("using System.Data.OleDb; \n");

code.Append("using System.Xml; \n");

code.Append("namespace EvalGuy { \n"); //生成代碼的命名空間為EvalGuy,和本代碼壹樣

code.Append(" public class _Evaluator { \n"); //產生 _Evaluator 類,所有可執行代碼均在此類中運行

foreach (EvaluatorItem item in items) //遍歷每壹個可執行字符串項

{

code.AppendFormat(" public {0} {1}() ", //添加定義公***函數代碼

item.ReturnType.Name, //函數返回值為可執行字符串項中定義的返回值類型

item.Name); //函數名稱為可執行字符串項中定義的執行字符串名稱

code.Append("{ "); //添加函數開始括號

code.AppendFormat("return ({0});", item.Expression);//添加函數體,返回可執行字符串項中定義的表達式的值

code.Append("}\n"); //添加函數結束括號

}

code.Append("} }"); //添加類結束和命名空間結束括號

//得到編譯器實例的返回結果

CompilerResults cr = comp.CompileAssemblyFromSource(cp, code.ToString());

if (cr.Errors.HasErrors) //如果有錯誤

{

StringBuilder error = new StringBuilder(); //創建錯誤信息字符串

error.Append("編譯有錯誤的表達式: "); //添加錯誤文本

foreach (CompilerError err in cr.Errors) //遍歷每壹個出現的編譯錯誤

{

error.AppendFormat("{0}\n", err.ErrorText); //添加進錯誤文本,每個錯誤後換行

}

throw new Exception("編譯錯誤: " + error.ToString());//拋出異常

}

Assembly a = cr.CompiledAssembly; //獲取編譯器實例的程序集

_Compiled = a.CreateInstance("EvalGuy._Evaluator"); //通過程序集查找並聲明 EvalGuy._Evaluator 的實例

}

#endregion

#region 公有成員

/// <summary>

/// 執行字符串並返回整型值

/// </summary>

/// <param name="name">執行字符串名稱</param>

/// <returns>執行結果</returns>

public int EvaluateInt(string name)

{

return (int)Evaluate(name);

}

/// <summary>

/// 執行字符串並返回字符串型值

/// </summary>

/// <param name="name">執行字符串名稱</param>

/// <returns>執行結果</returns>

public string EvaluateString(string name)

{

return (string)Evaluate(name);

}

/// <summary>

/// 執行字符串並返回布爾型值

/// </summary>

/// <param name="name">執行字符串名稱</param>

/// <returns>執行結果</returns>

public bool EvaluateBool(string name)

{

return (bool)Evaluate(name);

}

/// <summary>

/// 執行字符串並返 object 型值

/// </summary>

/// <param name="name">執行字符串名稱</param>

/// <returns>執行結果</returns>

public object Evaluate(string name)

{

MethodInfo mi = _Compiled.GetType().GetMethod(name);//獲取 _Compiled 所屬類型中名稱為 name 的方法的引用

return mi.Invoke(_Compiled, null); //執行 mi 所引用的方法

}

#endregion

#region 靜態成員

/// <summary>

/// 執行表達式並返回整型值

/// </summary>

/// <param name="code">要執行的表達式</param>

/// <returns>運算結果</returns>

static public int EvaluateToInteger(string code)

{

Evaluator eval = new Evaluator(typeof(int), code, staticMethodName);//生成 Evaluator 類的對像

return (int)eval.Evaluate(staticMethodName); //執行並返回整型數據

}

/// <summary>

/// 執行表達式並返回字符串型值

/// </summary>

/// <param name="code">要執行的表達式</param>

/// <returns>運算結果</returns>

static public string EvaluateToString(string code)

{

Evaluator eval = new Evaluator(typeof(string), code, staticMethodName);//生成 Evaluator 類的對像

return (string)eval.Evaluate(staticMethodName); //執行並返回字符串型數據

}

/// <summary>

/// 執行表達式並返回布爾型值

/// </summary>

/// <param name="code">要執行的表達式</param>

/// <returns>運算結果</returns>

static public bool EvaluateToBool(string code)

{

Evaluator eval = new Evaluator(typeof(bool), code, staticMethodName);//生成 Evaluator 類的對像

return (bool)eval.Evaluate(staticMethodName); //執行並返回布爾型數據

}

/// <summary>

/// 執行表達式並返回 object 型值

/// </summary>

/// <param name="code">要執行的表達式</param>

/// <returns>運算結果</returns>

static public object EvaluateToObject(string code)

{

Evaluator eval = new Evaluator(typeof(object), code, staticMethodName);//生成 Evaluator 類的對像

return eval.Evaluate(staticMethodName); //執行並返回 object 型數據

}

#endregion

#region 私有成員

/// <summary>

/// 靜態方法的執行字符串名稱

/// </summary>

private const string staticMethodName = "__foo";

/// <summary>

/// 用於動態引用生成的類,執行其內部包含的可執行字符串

/// </summary>

object _Compiled = null;

#endregion

}

/// <summary>

/// 可執行字符串項(即壹條可執行字符串)

/// </summary>

public class EvaluatorItem

{

/// <summary>

/// 返回值類型

/// </summary>

public Type ReturnType;

/// <summary>

/// 執行表達式

/// </summary>

public string Expression;

/// <summary>

/// 執行字符串名稱

/// </summary>

public string Name;

/// <summary>

/// 可執行字符串項構造函數

/// </summary>

/// <param name="returnType">返回值類型</param>

/// <param name="expression">執行表達式</param>

/// <param name="name">執行字符串名稱</param>

public EvaluatorItem(Type returnType, string expression, string name)

{

ReturnType = returnType;

Expression = expression;

Name = name;

}

}

}

這是調用方法

Console.WriteLine("Test0: {0}", Evaluator.EvaluateToInteger("(30 + 4) * 2"));

Console.WriteLine("Test1: {0}", Evaluator.EvaluateToString("\"Hello \" + \"There\""));

Console.WriteLine("Test2: {0}", Evaluator.EvaluateToBool("30 == 40"));

Console.WriteLine("Test3: {0}", Evaluator.EvaluateToObject("new DataSet()"));

EvaluatorItem[] items = {

new EvaluatorItem(typeof(int), "(30 + 4) * 2", "GetNumber"),

new EvaluatorItem(typeof(string), "\"Hello \" + \"There\"",

"GetString"),

new EvaluatorItem(typeof(bool), "30 == 40", "GetBool"),

new EvaluatorItem(typeof(object), "new DataSet()", "GetDataSet")

};

Evaluator eval = new Evaluator(items);

Console.WriteLine("TestStatic0: {0}", eval.EvaluateInt("GetNumber"));

Console.WriteLine("TestStatic1: {0}", eval.EvaluateString("GetString"));

Console.WriteLine("TestStatic2: {0}", eval.EvaluateBool("GetBool"));

Console.WriteLine("TestStatic3: {0}", eval.Evaluate("GetDataSet"));

記得壹定要引用EvalGuy命名空間!

————————————————————————————————

網上找的,看看吧

原創 C#動態執行字符串

在編寫C#程序的時候,有時我們需要動態生成壹些代碼並執行。然而C#不像JavaScript有壹個Eval函數,可以動態的執行代碼。所有這些功能都要我們自己去完成,在參考了許多文章及代碼之後,覺得/csharp/runtime_eval.asp最為有用。於是我將其添加註釋後放於此處供大家學習。

這是網址

/hsrzq/archive/2009/08/17/4456361.aspx

  • 上一篇:企業找外包公司做網站需要註意哪些地方
  • 下一篇:SSD源代碼不收斂
  • copyright 2024編程學習大全網