首页 / 知识
关于反射:如何动态评估C#代码?
2023-04-11 19:42:00

How can I evaluate C# code dynamically?
我可以做一个
我要尝试执行的一个示例是:我有一个整数变量(例如 使用Javascript确实很简单。 有什么办法用C#做到这一点? 不幸的是,C#不是那样的动态语言。 但是,您可以做的是创建一个包含类和所有内容的C#源代码文件,并通过C#的CodeDom提供程序运行它,并将其编译为程序集,然后执行它。
MSDN上的该论坛帖子在页面下方包含一些示例代码的答案: 我很难说这是一个很好的解决方案,但是还是有可能的。 您期望在该字符串中使用哪种代码?如果它是有效代码的次要子集,例如数学表达式,则可能存在其他替代方法。 编辑:好吧,这教我先彻底阅读问题。是的,思考可以在这里给您一些帮助。 如果将字符串除以;首先,要获取单个属性,可以使用以下代码为类的特定属性获取PropertyInfo对象,然后使用该对象来操纵特定对象。
链接:PropertyInfo.SetValue方法 使用Roslyn脚本API(此处有更多示例):
您还可以运行任何代码:
并参考先前运行中生成的代码:
并不是的。您可以使用反射来实现所需的功能,但它不会像Javascript那样简单。例如,如果要将对象的私有字段设置为某些内容,则可以使用以下功能:
这是c#下的eval函数。我用它来从字符串转换匿名函数(Lambda表达式)。
我已经编写了一个开源项目Dynamic Expresso,该项目可以将使用C#语法编写的文本表达式转换为委托(或表达式树)。无需使用编译或反射就可以将表达式解析并转换为表达式树。 您可以这样写:
要么
我的工作基于Scott Gu的文章http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx。 所有这些肯定会起作用。就个人而言,对于该特定问题,我可能会采取一些不同的方法。也许是这样的:
使用这种模式时,必须注意数据是按引用而不是按值存储的。换句话说,不要对基元执行此操作。您必须使用他们big肿的同类。 我意识到这不完全是问题,但是这个问题已经很好地回答了,我认为也许替代方法可能会有所帮助。 如果您绝对要执行C#语句,我现在不知道,但是您已经可以在C#2.0中执行Javascript语句。开源库Jint可以做到。这是.NET的Javascript解释器。传递一个Javascript程序,它将在您的应用程序中运行。您甚至可以将C#对象作为参数传递并对其进行自动化。 另外,如果只想评估属性的表达式,请尝试使用NCalc。 您可以使用反射来获取属性并调用它。像这样:
也就是说,假设具有该属性的对象称为" theObject" :) 您还可以实现Webbrowser,然后加载包含javascript的html文件。
然后,您在此浏览器上使用 我在几个项目中都做到了这一点,并且效果很好。 希望能帮助到你 您可以检查Heleonix.Reflection库。它提供了动态获取/设置/调用成员(包括嵌套成员)的方法,或者如果明确定义了成员,则可以创建比反射更快的getter / setter(lambda编译为委托):
或者,如果属性的数量不是无穷无尽的,则可以生成setter并对其进行排序(由于它们是编译的委托,因此setter更快):
设置器的类型可以为 使用反射在运行时针对对象解析和评估数据绑定表达式。 DataBinder.Eval方法 我编写了一个程序包SharpByte.Dynamic,以简化动态编译和执行代码的任务。可以使用扩展方法在任何上下文对象上调用该代码,如此处所述。 例如,
返回3;
返回上下文对象的字符串表示形式;
将这些语句作为脚本运行,等等。 如此处示例所示,可以使用工厂方法轻松获得可执行文件-您所需要的只是源代码和任何预期的命名参数列表(令牌使用三括号表示法嵌入,例如{{{0}} },以避免与string.Format()以及类似Handlebars的语法发生冲突:
每个可执行对象(脚本或表达式)都是线程安全的,可以存储和重用,支持从脚本内进行日志记录,存储计时信息和遇到的最后一个异常等。每个对象上还编译有一个Copy()方法以允许创建廉价副本,即使用从脚本或表达式编译的可执行对象作为创建其他对象的模板。 在适度的硬件上,执行已编译的脚本或语句的开销相对较低,大约不到一微秒,并且已编译的脚本和表达式将被缓存以供重用。 我试图通过其名称获取结构(类)成员的值。结构不是动态的。直到我终于明白了,所有的答案才起作用:
此方法将通过其名称返回成员的值。它适用于常规结构(类)。 您可以使用原型函数来做到这一点:
等等... 不幸的是,C#没有任何本机工具可以完全满足您的要求。 但是,我的C#评估程序确实允许评估C#代码。它提供了在运行时评估C#代码的功能,并支持许多C#语句。实际上,此代码可在任何.NET项目中使用,但是仅限于使用C#语法。请查看我的网站http://csharp-eval.com,以获取更多详细信息。 正确的答案是您需要缓存所有结果以保持较低的内存使用率。 一个例子看起来像这样
并将其添加到列表
保存ID并在代码中使用它 希望这可以帮助 |
最新内容
相关内容
python如何执行python文件
python如何执行python文件,代码,培训,文件,程序,命令,模式,事半功倍,后缀,文本,以上,用文本编辑器写Python程序,然后保存为后缀为.py的文件,就python怎么执行.py文件
python怎么执行.py文件,培训,位置,代码,文件,空格,路径,文件名,时候,右侧,单击,要运行一个已经编写好的.py文件,可以单击开始菜单,在“搜索程序python在python中如何同时给多个变
python在python中如何同时给多个变量赋值?,培训,连续,名称,赋值,变量,函数,模块,整数,定义,常量,同时赋多个值以下是一种很酷的编程捷径:在Pytpythonfinal作用域的代码一定会被
pythonfinal作用域的代码一定会被执行吗?,代码,培训,异常,流程,作用,函数,上面,以上,需求,发生,python在正常的情况下,finally作用域的代码一pythoncondition条件变量的作用
pythoncondition条件变量的作用,培训,变量,条件,线程,方法,作用,实例,对象,眼睛,以上,1、Python提供的Condition对象支持复杂的线程同步。2、python模块中判断全局变量的赋值
python模块中判断全局变量的赋值,培训,模块,赋值,脚本,属性,所在,以上,原因,方法,教程,python模块中判断全局变量的赋值1、在模块中,我们需要python变量如何拼接
python变量如何拼接,名字,培训,变量,字符串,后面,写法,语句,前面,以上,错误,python变量如何拼接1、在执行打印语句的时候我们可以使用拼接字python全局变量和局部变量的区分
python全局变量和局部变量的区分,位置,名称,培训,变量,函数,局部,定义,外部,声明,内部,python全局变量和局部变量的区分1、区别(1)主要是定义在Web应用程序上执行压力测试?
在Web应用程序上执行压力测试?,在Web应用程序上执行压力测试?,应用程序,主页,写了,简单,Performing a Stress Test on Web ApplicationPHP变量是按值还是按引用传递?
PHP变量是按值还是按引用传递?,PHP变量是按值还是按引用传递?,引用传递,数组,变量,参见,Are PHP Variables passed by value or by ref如何动态拼接的HTML字符串绑定到页
如何动态拼接的HTML字符串绑定到页面DOM显示,如何,动态,拼接,的,HTML,字符串,绑定,到,页面,,在Web前端开发中,我们经常会遇见需要动如何查看JavaScript变量的数据类型
如何查看JavaScript变量的数据类型?,如何,查看,JavaScript,变量,的,数据,类型,typeof,, typeof操作符 你可以使用typeof操作符来查