C#动态代码如何执行

fanlose2 2010-09-03 03:10:45
如题,例如:页面有2个条件控件,ID1,ID2, C#代码如下:

if((ID1.Value==1 || ID2.Value==2) && ID2.Value==2)
{
//do_something
}

if后面的条件是直接从数据库中取出的内容,在代码里如何直接用。

例如: string condition="(ID1.Value==1 || ID2.Value==2) && ID2.Value==2";
if(方法(condition))
{
//do_something
}

这种方法如何实现呢?请高手帮忙
...全文
825 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
glest 2010-09-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 glest 的回复:]

http://www.cnblogs.com/kingthy/archive/2007/12/15/995641.html
[/Quote]

很好用啊,用JScript语法,哈哈,和C#差不多,强烈推荐。

object o= Evaluator.EvalToObject("1==2");
MessageBox.Show(o.ToString());
H_Four 2010-09-03
  • 打赏
  • 举报
回复
学习了~~
glest 2010-09-03
  • 打赏
  • 举报
回复
http://www.cnblogs.com/kingthy/archive/2007/12/15/995641.html
fanlose2 2010-09-03
  • 打赏
  • 举报
回复
ID1 ID2 是我模拟的控件 ,实际并不确定仅有这2个控件,而是多个控件,多个条件组合,多个被影响的控件。 这个在数据库里表现为一个字符串。
fanlose2 2010-09-03
  • 打赏
  • 举报
回复
保存控件和控件的值再和页面中控件的值比较,的确不是合理的方法。
这个功能不是针对某一个具体的项目和其中的页面,而是针对所有产品的页面控件状态功能,其功能是根据当前页面控件条件设定当前页面某些控件的状态。 条件个数和状态都不确定,被控制的控件也不确定,这让我很头疼。
我咨询了做审计系统的老程序员,他们是这么处理的。只是他们有个方法能直接解析取出的数据,C#里不知道该怎么执行动态的代码。
glest 2010-09-03
  • 打赏
  • 举报
回复
楼主可以了解下动态语言,如ironpython。专门针对你这种需要动态执行代码的需求设计的语言。
jieon 2010-09-03
  • 打赏
  • 举报
回复
if(string.Equals("ID1.Value==1 || ID2.Value==2) && ID2.Value==2")){
//do something??
}
游北亮 2010-09-03
  • 打赏
  • 举报
回复
再认真看了下楼主的需求,确实很有问题
从数据库取出的条件,却和要求引用当前Page实例里的控件

这确实,需求很不合理
游北亮 2010-09-03
  • 打赏
  • 举报
回复
调用:
object obj = ExecuteCode("1 == 2");
if (obj == null)
ret = "返回了null";
else
ret = obj.ToString();//Convert.ToString(

        #region 执行静态代码
/// <summary>
/// 执行代码,返回结果(默认引用了System.dll、System.Data.dll、System.Xml.dll、System.Web.dll 4个程序集)
/// </summary>
/// <param name="code">代码</param>
/// <param name="arrReferencedAssemblies">要引用的程序集</param>
/// <returns></returns>
public static object ExecuteCode(string code, string[] arrReferencedAssemblies)
{
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll"); //引用dll
objCompilerParameters.ReferencedAssemblies.Add("System.Data.dll"); //引用dll
objCompilerParameters.ReferencedAssemblies.Add("System.Xml.dll"); //引用dll
objCompilerParameters.ReferencedAssemblies.Add("System.Web.dll"); //引用dll
if (arrReferencedAssemblies != null)
foreach (string item in arrReferencedAssemblies)
objCompilerParameters.ReferencedAssemblies.Add(item);
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;

CompilerResults cr = (objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters,
new [] { GenerateCode(code) }));

if (cr.Errors.HasErrors)
{
StringBuilder l_err = new StringBuilder("编译错误:");
foreach (CompilerError err in cr.Errors)
{
l_err.AppendLine(err.ErrorText);
}
return l_err.ToString();
}
// 通过反射,调用HelloWorld的实例
Assembly objAssembly = cr.CompiledAssembly;
object objHelloWorld = objAssembly.CreateInstance("CommonOtherDynamicCodeGenerate.CommonOtherDynamicCodeGenerateClass");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");
// 调用执行
return objMI.Invoke(objHelloWorld, null);
}

/// <summary>
/// 执行代码,返回结果(默认引用了System.dll、System.Data.dll、System.Xml.dll 3个程序集)
/// </summary>
/// <param name="code"></param>
/// <returns></returns>
public static object ExecuteCode(string code)
{
return ExecuteCode(code, null);
}

private static string GenerateCode(string code)
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("using System.Text;");
sb.Append(Environment.NewLine);
sb.Append("using System.IO;");
sb.Append(Environment.NewLine);
sb.Append("using System.Data;");
sb.Append(Environment.NewLine);
sb.Append("using System.Xml;");
sb.Append(Environment.NewLine);
sb.Append("using System.Web;");
sb.Append(Environment.NewLine);
sb.Append("using System.Collections;");
sb.Append(Environment.NewLine);
sb.Append("using System.Collections.Generic;");
sb.Append(Environment.NewLine);
sb.Append("namespace CommonOtherDynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(Environment.NewLine);
sb.Append(" public class CommonOtherDynamicCodeGenerateClass");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" public object OutPut()");
sb.Append(Environment.NewLine);
sb.Append(" {");
sb.Append(Environment.NewLine);
sb.Append(" return " + code + ";");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append(" }");
sb.Append(Environment.NewLine);
sb.Append("}");

return sb.ToString();
}
#endregion
bloodish 2010-09-03
  • 打赏
  • 举报
回复
你的思路有问题,数据库里只需要存ID1和ID2这两个控件需要比较的值,也就是1和2
其他的条件判断应该是代码里的事情.

不过Anders Hejlsberg在PDC2008 Show过使用CSharpEvaluator动态解析并执行C#代码,只可惜到.Net4.0出来的时候这个class又不见踪影了
yongchaochu 2010-09-03
  • 打赏
  • 举报
回复
或者你可以把从数据库中取出的数据放到dateset中,用的时候直接从内存中拿,如ds.tables[0].Rows[i][j]
yongchaochu 2010-09-03
  • 打赏
  • 举报
回复
public bool CheckUserExists(string username)
{
...//数据库检索是否存在该用户名,从略
int count=Convert.ToInt(cmd.ExecuteScalar());
if(count>0){return true;}
return true;
}
if(CheckUserExists(x))//x是你从控件或其他渠道取到的数据或用户输入的数据
{
//条件若成立 执行你想要执行的下续工作
}

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧