首页 > 编程语言 >【转】netcore 下的 C# 表达式求值

【转】netcore 下的 C# 表达式求值

时间:2024-10-14 14:48:53浏览次数:5  
标签:eval netcore C# var Eval CSharp 求值 new 表达式

转自:https://www.cnblogs.com/surfsky/p/12918566.html

需求场景:

表达式为系统功能维护,提取后,将可执行的表达式放入Net Core 下if(表达式)来判定是否正确,因维护的表达式为字符串类型,

例如 "2>1"

需要实现 if(2>1)

{

//表达式正确逻辑

}

else

{

//表达式不成立逻辑

}

 

netframework 下的 codedom 代码已经不能用了,会报错,改用Roslyn来写:

先安装包

install-package Microsoft.CodeAnalysis.CSharp

核心代码,尝试了好久

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
public class CsEvaluator
{
        /// <summary>CSharp 表达式求值</summary>
        /// <param name="expression">CSharp 表达式。如:2.5, DateTime.Now</param>
        public object Eval(string expression)
        {
            // 代码
            var text = string.Format(@"
                using System;
                public class Calculator
                {{
                    public static object Evaluate() {{ return {0}; }}
                }}", expression);

            // 编译生成程序集
            var tree = SyntaxFactory.ParseSyntaxTree(text);
            var compilation = CSharpCompilation.Create(
                "calc.dll",
                new[] { tree },
                options: new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary),
                references: new[] { 
                    MetadataReference.CreateFromFile(typeof(object).Assembly.Location)
                });
            Assembly compiledAssembly;
            using (var stream = new MemoryStream())
            {
                var compileResult = compilation.Emit(stream);
                compiledAssembly = Assembly.Load(stream.GetBuffer());
            }

            // 用反射执行方法
            var calculatorClass = compiledAssembly.GetType("Calculator");
            var evaluateMethod = calculatorClass.GetMethod("Evaluate");
            return evaluateMethod.Invoke(null, null);
        }
}

可以快乐的测试了

var eval = new CsEvaluator();
var b = eval.Eval("5 > 4");
var d = eval.Eval("2.5");
var dt1 = eval.Eval("new DateTime(2018,1,1)");
var dt2 = eval.Eval("DateTime.Now");

 

标签:eval,netcore,C#,var,Eval,CSharp,求值,new,表达式
From: https://www.cnblogs.com/Violety/p/18464193

相关文章

  • Qt/C++编写的mqtt调试助手使用说明
    一、使用说明第一步,选择协议前缀,可选mqtt://、mqtts://、ws://、wss://四种,带s结尾的是走ssl通信,ws表示走websocket通信。一般选默认的mqtt://就好。第二步,填写服务所在主机地址,可以是IP地址也可以是网址,只要真实存在的就行。第三步,填写通信所用端口号,mqtt默认端口号是1883,以......
  • 整数反转(C实现)
    题目:力扣第七题是“整数反转”(ReverseInteger)。题目要求我们给定一个32位有符号整数,反转其数字。如果反转后的整数超过了32位有符号整数的范围[-2^31,2^31-1],则返回0。解题思路:处理正负号:我们首先需要记录输入整数的符号,如果是负数,则最终结果也应该是负数。逐......
  • CogVideoX:Text-to-Video Diffusion Models with An Expert Transformer
    研究背景背景介绍:这篇文章的研究背景是文本到视频模型的快速发展,特别是Transformer架构和扩散模型的应用。早期尝试预训练和扩展Transformer生成视频已经显示出巨大潜力,如CogVideo和Phenaki。扩散模型在多模态生成方面也取得了显著进展,包括视频生成。研究内容:该问题的......
  • springboot~ConstraintValidatorContext验证两个字段内容相同
    场景我在开发修改密码功能,通过原密码和新密码及确认新密码,希望通过ConstraintValidator这个方式来校验新密码和确认新密码,规则是这两个密码需要是相同的。参考文档https://github.com/micronaut-projects/micronaut-core/issues/3243https://stackoverflow.com/questions/377......
  • 初识苹果官方coreMl模型库
    1.FastViTImageClassificationFastViT是一种混合架构的视觉Transformer(VisionTransformer,简称ViT),它结合了卷积神经网络(CNN)和Transformer的优势,用于图像分类任务。该模型主要设计目的是在图像分类任务中,以更快的推理速度和较高的准确率分类出图像中的主要物体。适用场......
  • CV高手是怎么炼成的?
    你平时都怎么复制粘贴的?是否每次都是复制一段粘贴一段?是否厌倦了每次只能复制粘贴一次的限制?那这篇文章就是为你量身订做的。CopyQ简介CopyQisclipboardmanager–adesktopapplicationwhichstorescontentofthesystemclipboardwheneveritchangesandallowstos......
  • nacos 实战(史上最全)【转自】
    1、Nacos优势问题,既然有了Eureka,为啥还要用Nacos?而Nacos作为微服务核心的服务注册与发现中心,让大家在Eureka和Consule之外有了新的选择,开箱即用,上手简洁,暂时也没发现有太大的坑。注:本文以PDF持续更新,最新尼恩架构笔记、面试题的PDF文件,请从下面的链接获取:语雀 ......
  • 实战!oracle 11g一键安装脚本分享
    分享一个常用的数据库一键安装脚本,大家可以从我的网盘进行下载链接:https://pan.baidu.com/s/1iV-0zeXrwhJxJcm9qA_P_g提取码:apbc脚本内容:#!/bin/bash#一键安装oracle数据库#修改主机名hostnamectlset-hostnamemyoracle#添加主机名与IP对应记录public_ip=$(hostn......
  • 制造业单项冠军 | 麦澜德如何用CRM管业务,做到“专精特新” ?
    南京麦澜德医疗科技股份有限公司,股票代码:688273.SH(以下简称:麦澜德)成立于2013年,是国内女性全生命周期物理康复干预技术解决方案提供商。公司产品广泛应用于妇产、盆底康复、生殖康复、泌尿肛肠、体检等医疗健康领域。荣获工信部专精特新小巨人企业、苏南潜在独角兽铜牌等高新企......
  • ctfshow
    pwn19fork()函数创建了一个子进程。如果当前代码处于父进程(fork()返回1)则进入if语句块。如果是子进程(fork()返回0),则进入else语句块。在子进程中给予了用户一个shell权限,允许用户在子进程中输入数据并通过system运行。值得注意的是在read函数前有一句fclose(_bss......