首页
学习
活动
专区
工具
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 命名空间的类型,而无需使用限定符。...如果程序集在内存(包括交互式窗口中执行示例时),脚本将无法访问该类型。请参阅此处的问题。

23510

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

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

1.6K60
  • 使用 Roslyn 编译器服务

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

    1.2K80

    惊呆了,老外竟然用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!" ?

    78520

    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

    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): 就是把所有的参数前面都加上_下划线,这样你函数,一眼就可以看出那些是局部变量,那些是作为参数传入的

    40510

    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

    .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里面去。

    753100

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

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

    51610

    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.5K60

    CSharp委托与匿名函数

    实际上,c#,我们可以利用更加舒服的语法糖来实现:委托。委托的声明类似于函数,但是不带函数体,且要用delegate关键字。...在这样的情况下,我使用这两个委托的时候,可以上面Main方法的语法一样,首先定义一个委托类型(EventHandle myEventHandle),通过new 委托的方式将方法设置到委托(= new...以后的开发,我们可能会定义更多的类似结构的委托,返回值或有不同,参数列表或有不同,就像下面这种情形: namespace XXX { public delegate void EventHandle...而匿名函数c#又分为两种:Lambda表达式和匿名方法表达式几乎所有的情况下,Lambda表达式都比匿名方法表达式更为简介具有表现力。...) {代码块} 从表达式来看,匿名方法实际上就是单纯的将函数名省去,而其他部分都和一般定义一个方法一样

    20520

    C# 7.0 探索之旅

    C# 7.0 我们用模式改进了两个已有的语言结构: is 表达式的右边现在可以是表达式,而不仅仅是类型了 switch 语句中的 case 子句现在可以匹配模式,而不仅仅是常量了 未来的 C#...Out 变量(Out variables) 之前的 C# 版本,使用 out 参数并不像我们期盼的那样流畅。在你能够使用 out 参数来调用一个函数之前,你首先需要声明待传入的变量。...,就如同在 lambda 表达式一样。...var b = 0b1010_1011_1100_1101_1110_1111; 引用返回和引用本地变量(Ref returns and locals) 就像你可以 C# 以引用方式传值(使用 ref...但是 C# 7.0 我们直接允许将 throw 特定位置作为一个表达式: class Person { public string Name { get; } public Person

    1.3K90
    领券