两个问题:1.c#中有没有象js里的eval函数一样允许源代码的动态执行的函数?2正则表达式... string.Format("今天是 {0},天气晴朗",DateTime.Now); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.c#中有没有象js里的eval函数一样允许源代码的动态执行的函数?我现在有一个文本配置文件有这样一行代码:"今天是"+@@date+",天气晴朗"现在我想在c#里将这行的@@date替换成DateTime.Today,得到今天的日期,在js里有eval(string)这样的用法,但是c#里却不知道怎么写//不需要用eval,用变量替换就可以了 同意lxcc(虫子|需要点勇气和信心) ,用Today替换字符串中的内容即可 我只是举个例子:"今天是"+@@date+",天气晴朗",也可能是字符串“你好吗?"+@@name+"先生、小姐",也就是这个字符串不是固定的,变量也不是固定的,这时候该怎么写呢? C#中就是没有一个这么好的函数,我用一个比较简单的办法实现了一半,为何是一半,看了就知道。我的做法是这样的,用j#编一个Eval的类,编译后在C#里引用,把C#中要执行的语句传过去,利用J#的eval来执行就可以了,不过因为是两种不相同的语言,所以在C#的特有的方法就不能用这种方法实现了,所以说只实现了一半。代码非常简单:class evaluate{ public function jsEval(aStr: String) { return eval(aStr); }} 在codeproject里也有专门谈到用C#实现的,不过资料我弄丢了,你可以到哪里去找一下,不过现在那个网站访问非常慢 一个例子using System;using System.CodeDom.Compiler;using System.Reflection;using Microsoft.JScript;namespace OdeToCode.Utility{ public class Evaluator { public static int EvalToInteger(string statement) { string s = EvalToString(statement); return int.Parse(s.ToString()); } public static double EvalToDouble(string statement) { string s = EvalToString(statement); return double.Parse(s); } public static string EvalToString(string statement) { object o = EvalToObject(statement); return o.ToString(); } public static object EvalToObject(string statement) { return _evaluatorType.InvokeMember( "Eval", BindingFlags.InvokeMethod, null, _evaluator, new object[] { statement } ); } static Evaluator() { ICodeCompiler compiler; compiler = new JScriptCodeProvider().CreateCompiler(); CompilerParameters parameters; parameters = new CompilerParameters(); parameters.GenerateInMemory = true; CompilerResults results; results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource); Assembly assembly = results.CompiledAssembly; _evaluatorType = assembly.GetType("Evaluator.Evaluator"); _evaluator = Activator.CreateInstance(_evaluatorType); } private static object _evaluator = null; private static Type _evaluatorType = null; private static readonly string _jscriptSource = @"package Evaluator { class Evaluator { public function Eval(expr : String) : String { return eval(expr); } } }"; }} 利用.net的即时编译功能可能会做到 关于调用webservice的问题 如何动态添加table中的列 datagridview里想加一列序号,该怎么加 c#怎么忽略错误 我是c#的初学者,请推荐本书 如何移除指定id的span的内容? 如何解决.net耗费内存的方法 请教怎样在C#中执行SQL脚本文件? 根据XML文件读取各节点信息生成TreeView 谁有 ASP.NET入门经典---C#编程篇 的源码啊?(能提供者尽数给分!) 有没有人能告诉我,这个线程错误需要怎么改 怎样动态执行方法
我现在有一个文本配置文件有这样一行代码:
"今天是"+@@date+",天气晴朗"
现在我想在c#里将这行的@@date替换成DateTime.Today,得到今天的日期,
在js里有eval(string)这样的用法,但是c#里却不知道怎么写
//不需要用eval,用变量替换就可以了
我的做法是这样的,用j#编一个Eval的类,编译后在C#里引用,把C#中要执行的语句传过去,利用J#的eval来执行就可以了,不过因为是两种不相同的语言,所以在C#的特有的方法就不能用这种方法实现了,所以说只实现了一半。代码非常简单:
class evaluate
{
public function jsEval(aStr: String)
{
return eval(aStr);
}
}
using System.CodeDom.Compiler;
using System.Reflection;
using Microsoft.JScript;namespace OdeToCode.Utility
{
public class Evaluator
{
public static int EvalToInteger(string statement)
{
string s = EvalToString(statement);
return int.Parse(s.ToString());
} public static double EvalToDouble(string statement)
{
string s = EvalToString(statement);
return double.Parse(s);
} public static string EvalToString(string statement)
{
object o = EvalToObject(statement);
return o.ToString();
} public static object EvalToObject(string statement)
{
return _evaluatorType.InvokeMember(
"Eval",
BindingFlags.InvokeMethod,
null,
_evaluator,
new object[] { statement }
);
}
static Evaluator()
{
ICodeCompiler compiler;
compiler = new JScriptCodeProvider().CreateCompiler(); CompilerParameters parameters;
parameters = new CompilerParameters();
parameters.GenerateInMemory = true;
CompilerResults results;
results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource); Assembly assembly = results.CompiledAssembly;
_evaluatorType = assembly.GetType("Evaluator.Evaluator");
_evaluator = Activator.CreateInstance(_evaluatorType);
}
private static object _evaluator = null;
private static Type _evaluatorType = null;
private static readonly string _jscriptSource =
@"package Evaluator
{
class Evaluator
{
public function Eval(expr : String) : String
{
return eval(expr);
}
}
}";
}
}