首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在c#中:表达式评估函数就像flash脚本一样

在C#中,表达式评估函数可以像Flash脚本一样,通过使用C#编译器和反射来实现。这种方法可以让你在运行时动态地评估和执行C#表达式。以下是一个简单的示例,展示了如何在C#中实现这样一个功能:

代码语言:csharp
复制
using System;
using System.CodeDom.Compiler;
using System.Reflection;

public class ExpressionEvaluator
{
    public static object Evaluate(string expression)
    {
        // 创建一个C#编译器
        CSharpCodeProvider provider = new CSharpCodeProvider();

        // 编写一个临时的C#代码文件,包含一个返回表达式结果的方法
        string code = @"
            using System;
            namespace ExpressionEvaluator
            {
                public class Evaluator
                {
                    public static object Evaluate()
                    {
                        return (" + expression + @");
                    }
                }
            }";

        // 编译代码文件
        CompilerResults results = provider.CompileAssemblyFromSource(new CompilerParameters(), code);

        // 如果编译成功,则执行Evaluate方法并返回结果
        if (results.Errors.Count == 0)
        {
            Assembly assembly = results.CompiledAssembly;
            Type evaluatorType = assembly.GetType("ExpressionEvaluator.Evaluator");
            MethodInfo evaluateMethod = evaluatorType.GetMethod("Evaluate");
            return evaluateMethod.Invoke(null, null);
        }
        else
        {
            // 如果编译失败,则返回null
            return null;
        }
    }
}

在这个示例中,我们使用了CSharpCodeProvider类来创建一个C#编译器,并编写了一个临时的C#代码文件,其中包含一个返回表达式结果的方法。然后,我们使用CompileAssemblyFromSource方法来编译代码文件,并使用反射来执行Evaluate方法并返回结果。

需要注意的是,这种方法存在一定的安全风险,因为它允许在运行时执行任意的C#代码。因此,在使用这种方法时,应该非常小心地控制输入的表达式,以避免潜在的安全漏洞。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.Net 编译器平台--- Roslyn Scripting APIs

using Microsoft.CodeAnalysis.CSharp.Scripting; 应用场景: 评估一个C#表达式(Evaluate a C# expression) 评估一个C#表达式(...强类型)(Evaluate a C# expression(strongly-typed)) 带错误处理的评估C#表达式(Evaluated a C# expression with error handling...C#脚本(Create and analyze a C# script) 自定义程序集加载(Customize assembly loading) 评估一个C#表达式(Evaluate a C# expression...WithImports("System.IO") 将 using System.IO; 添加到脚本选项中,使得可以在脚本代码中直接引用 System.IO 命名空间的类型,而无需使用限定符。...如果程序集在内存中(包括在交互式窗口中执行示例时),脚本将无法访问该类型。请参阅此处的问题。

26810

因为对Perl和Python不满?圣诞节无聊?编程语言的出现都这么随意吗?

麦卡锡在 IBM 研究代数表达式的微分运算时,产生了一系列对语言需求,包括:用数学函数控制流程的方法(即,递归和条件表达式);列表的自动分配;废弃列表的隐士回收。...但是这种想法遭到了当时 Lisp 程序员的反对,最后麦卡锡开了 MIT,从此 Lisp 的语法凝固在 S 表达式上。 Lisp 建立在列表和 lambda 演算和基础上,是函数式编程的鼻祖。...随着 Fortran 的诞生,其他一些语言也在开发中,这些语言的语法格式各不相同,而且和 Fortran 一样,都与运行它们的具体计算机关联(比如标示符长度、代码行数的限制等)。...在 Self 中对象创建对象的方式是自我拷贝,所以叫做原型。 Self 是原型面向对象语言的鼻祖,就像 SIMUAL 67 是类面向对象语的鼻祖。 A.20....; 表面上你在定义变量和赋值,其实只是对; 表面上你声明函数,其实只是表达式>对。

1.7K60
  • 使用 Roslyn 编译器服务

    .NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为一种可在代码中调用的服务...它就像是一个用于语言解析的加强版的正则表达式。你可以编写某种语言的语法规则,Antlr会为你生成代码],基于Antlr 有一个轻量级的C#编译器服务Expression Evaluator 。...如果我们要在CSharpScript.Create()函数创建一个脚本,通过函数ContinueWith 组成一个完整的脚本运行。...Roslyn提供了一个更为简单有效的解决办法:在会话中传入一个宿主对象,会话中的脚本程序也能访问宿主对象的各成员变量。...,然后表达式就可以计算结果,这个就是我们在工作流引擎里面要的表达式计算了。

    1.3K80

    惊呆了,老外竟然用50中编程语言写“Hello,Word!”,我服了...

    在职业生涯中,所有程序员都至少完成过一段“Hello,World!" 程序。在成长中,程序员通常会使用多种编程语言,大部分程序员甚至实现过十几种”Hello,World!”版本。...STOP END 在 Fortran 90 或者 95 版本中,“Hello, World!”...MATLAB - 1984 年 MATLAB 是“Matrix Laboratory”的缩写,它是一种脚本语言,用于数值计算。MATLAB 在同名的开发环境中编写。...它是 C 编程语言的扩展,就像 C++ 一样,但是和 C++ 又不一样,特别是在动态消息分发或者动态加载方面与 C++ 很不一样。...PHP 主要用于 Web,它是一种面向对象的命令式语言,能够像其他任何解释性语言一样在本地运行。 <? echo "Hello, World!" ?

    80520

    C#8.0新增特性

    C#8.0中,使用using可以不再将其用括号括起来,而是像一个关键字一样,在加在对象声明语句的开头,请看如下代码: 当运行到最后一个大括号时就会自动释放file对象。...sequence[^0] 不会引发异常,就像 sequence[sequence.Length] 一样。 对于任何数字 n,索引 ^n 与 sequence.Length - n 相同。...非托管构造类型: 在 C# 7.3 及更低版本中,构造类型(包含至少一个类型参数的类型)不能为非托管类型。 从 C# 8.0 开始,如果构造的值类型仅包含非托管类型的字段,则该类型不受管理。...与任何非托管类型一样,可以创建指向此类型的变量的指针,或针对此类型的实例在堆栈上分配内存块: 表达式:表达式中的stackal 从C# 8.0开始,如果 stackalloc 表达式的结果为 System.Span...在早期的C#版本中,$必须出现在@标记之前。 本节到此结束...

    1.1K40

    C#7.0中有哪些新特性?

    在 C#7.0,我们正在加强两个现有的具有模式的语言结构: is 表达式现在具有一种右手侧的模式,而不仅仅是一种类型 switch 语句中的 case 语句现在可以使用匹配模式,不只是常数值 在 C#的未来版本中...就像输出变量一样,模式变量是可变的。 注:就像输出变量一样,严格范围规则适用于Preview 4。...,就如同它们在 lambda 表达式中一样。...注意:在 Preview 4,局部函数在调用之前,必须被声明。这个限制将会被松开,以便使得局部函数从定义分配中读取时,能够被调用。...这是社区共享的示例,而不是 Microsoft C# 编译团队提供的,还是开源的! Throw 表达式  在表达式中间抛出一个异常是很容易的:只需为自己的代码调用一个方法!

    1.6K80

    欢迎来到 C# 9.0(Welcome to C# 9.0)

    初始化(init) 访问器和只读(readonly)字段 因为 init 访问器只能在初始化期间调用,所以允许它们更改封闭类的只读(readonly)字段,就像在构造函数中一样。...在 C# 9.0 中,您可以选择在顶级编写你的主程序(main program): using System; Console.WriteLine("Hello World!"); 允许任何语句。...此程序必须在文件中的 using 语句之后,任何类型或命名空间声明之前执行,并且只能在一个文件中执行。就像目前只能有一个 Main 方法一样。 如果您想返回一个状态码,您可以做。...例如,null 和 lambda表达式始终是目标类型的。 在 C# 9.0 中,一些以前不是目标类型的表达式变得可以由其上下文推导。...目标类型的 new 表达式(Target-typed new expressions) C# 中的 new 表达式总是要求指定类型(隐式类型的数组表达式除外)。

    1K30

    C# 7.3新特性一览

    初始化器中的表达式变量 在某种程度上,这看上去像个反特性。微软不仅没有增加功能,而是去掉了表达式变量的使用场景限制。...我们移除了在ctor初始化器中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个构造函数的函数体。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。...我们移除了在ctor初始化器中不能声明表达式变量(out变量声明和声明方式)的限制。这样声明的变量其作用域是整个构造函数的函数体。...在C# 7.3中,你可以在创建数组时对其初始化,就像你对普通数组所做的那样。该提案没有提供细节,但微软正考虑预初始化一个主数组,当函数被调用时可以快速复制。

    1.2K30

    Unity基础系列(二)——构建一个视图(可视化数学)

    这个章节,我们会使用脚本来创建预制体的实例,因此我们不再需要当前场景中的立方体实例。所以可以删除它了。 1.2 视图组件 我们需要一个C#脚本来生成我们的视图,所以创建一个并将其命名为Graph。...就像if语句一样,但后面必须有方括号中的表达式。与if一样,只有当表达式计算为true时,才会执行后面的代码块。之后,程序将循环回while语句。如果此时表达式再次计算为true,则代码块将再次执行。...(自定义Shader文件) 我们现在有一个着色器资源,可以像打开脚本一样打开它。我们的着色器文件包含了一些定义表面着色器的代码,它使用的语法与C#语法不同。...(正确的转换) 用Y坐标来表示绿色成分,就像X一样。在着色器中,我们可以在一行中使用IN.worldPos.xy并分配给o.Albedo.rg。 ? ?...添加一个Update方法,它有一个for循环,就像Awake方法一样,但是它的循环体中还没有任何代码。 ? 每次迭代,首先获得对当前数组元素的引用。然后找到那个点的位置。 ?

    2.8K10

    Python基础技术问题总结

    标准库中的copy模块提供了两个方法来实现拷贝.一个方法是copy,它返回和参数包含内容一样的对象. import copy new_list = copy.copy(existing_list) 有些时候...对于引用类型而言,默认是同一引用才返回true,但是系统重载了很多引用类型的 == (比如下文提到的string),所以c#中引用类型的比较并不建议使用 ==。...但是比较特殊的是字符串String,是一个特殊的引用型类型,在C#语言中,重载了string的equals()方法,使string对象用起来就像是值类型一样。...那么lambda表达式有什么好处?匿名函数,一般用来给filter,map这样的函数式编程服务,map(lambda x: x*2,[1,2,3,4,5]) 或者就是一次性产品。...命名技巧 今天阅读代码,发现一个不错的函数命名方式: def request(_argv): 就是把所有的参数前面都加上_下划线,这样你在函数体中,一眼就可以看出那些是局部变量,那些是作为参数传入的

    41110

    Edge.js:让.NET和Node.js代码比翼齐飞

    func函数接受多种格式的CLR代码,从源代码,文件名,到预编译的CLR都可以。在上面的3-8行中,程序指定了一个异步的Lambda表达式作为C#文本代码。...输入的参数在第4行被传递到C#异步Lambda表达式中,这个表达式在第6行将传入值附加到“.NET welcomes”字符串之后。...请看下面这个例子: 在第1-7行,Edge.js创造了一个JavaScript函数createCounter,这个是C# Lambda表达式的代理。...第4-5行的代码比较有趣:C#异步Lambda表达式的结果是一个Func>型的委托实例,它(第5行)的实现包含了第3行在闭包中定义的本地变量。...尽管本文中所有的例子都是使用C#写的,Edge.js支持在Node.js程序中运行任何CLR语言的代码。目前的扩展提供了对脚本语言F#、Python和PowerShell的支持。

    3.6K60

    .Net Micro Framework移植基础(包编译通过)

    .Net Micro Framework移植编译脚本 三、编译 没错,到了这里,可以编译了!双击STM32Stamp里面的Release_Flash.bat,编译就开始了!...编译脚本详解请看: .Net Micro Framework移植编译脚本 为了尽可能的保持跟大家一样,我通过SVN把代码更新到刚安装PK的时候,2012年5月1日!...image.png 在E:\MF\MFBin\STM32Stamp目录中,我们已经看到了一个241KB的TinyCLR.bin,这就是我们所需要的MF固件! 赶紧把它刷入板子测试一下!...(上面脚本中可以看到调用msbuild命令) 2,前面我们修改的Microsoft.SPOT.System.MDK.targets就是MSBuild格式,有兴趣的可以自己慢慢看; 3,每一个MF方案就是一个项目...在上面的编译脚本中,msbuild那一行后面有个注释,那就是把msbuild的结果输出到一个日志文件build.log里面去。

    803100

    JavaScript 权威指南第七版(GPT 重译)(二)

    4.3 函数定义表达式 函数定义表达式 定义了一个 JavaScript 函数,这种表达式的值是新定义的函数。在某种意义上,函数定义表达式是“函数文字”的一种方式,就像对象初始化器是“对象文字”一样。...但是,如果一个脚本定义了eval()的别名,然后通过另一个名称调用该函数,JavaScript 规范声明,当eval()被任何名称调用时,除了“eval”之外,它应该评估字符串,就像它是顶层全局代码一样...就像英语句子用句号终止并用句号分隔开一样,JavaScript 语句用分号终止(§2.6)。表达式被评估以产生一个值,但语句被执行以使某事发生。 使某事发生的一种方法是评估具有副作用的表达式。...它只能出现在脚本的开头或函数体的开头,在任何真实语句出现之前。 "use strict"指令的目的是指示随后的代码(在脚本或函数中)是严格代码。...如果脚本有"use strict"指令,则脚本的顶级(非函数)代码是严格代码。 如果函数体在严格代码中定义或具有"use strict"指令,则函数体是严格代码。

    53210

    雅虎Yahoo 前段优化 14条军规

    我们还记得 80-90%的最终用户响应时间花在下载页面中的各种元素上,如图像 文件、 样式表、 脚本和 Flash 等。 与其花在重构系统这个困难的任务上,还不如先 分布静态内容。...一种减少 CSS 表达式执行次数的方法是一次性表达式,即当第一次执行时就以 明确的数值代替表达式。如果必须动态设置的话,可使用事件处理函数代替。...象最小化一样,它通过删除注释和空格来减少 源码大小,同时它还可以对代码进行混淆处理。 作为混淆的一部分,函数名和变 量名被替换成短的字符串,这使得代码更紧凑,同时也更难读,使得难于被反 向工程。...删除重复的脚本文件 在一个页面中包含重复的 JS 脚本文件会影响性能,即它会建立不必要的 HTTP 请求和额外的 JS 执行。...这样同一个元素在不同的 web server 上,其 ETag 是不一样的。

    1.1K100
    领券