首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CSharpScript.EvaluateAsync未识别enum

CSharpScript.EvaluateAsync未识别enum
EN

Stack Overflow用户
提问于 2020-12-28 02:38:50
回答 2查看 430关注 0票数 0

我使用CSharpScript.EvaluateAsync从字符串生成谓词。使用字符串和int变量可以很好地工作,但是如果我试图传入字符串中的enum变量以进行转换,则会引发错误:

消息"(1,26):error CS0103:当前上下文中不存在名称‘CS0103’“字符串

以下是独立复制:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.CodeAnalysis.CSharp.Scripting;
using Microsoft.CodeAnalysis.Scripting;

namespace PredicateParser
{
    class Program
    {
        static void Main(string[] args)
        {
            var albums = new List<Album>
            {
                new Album { Quantity = 10, Artist = "Betontod", Title = "Revolution", Status = Status.Offline},
                new Album { Quantity = 50, Artist = "The Dangerous Summer", Title = "The Dangerous Summer", Status = Status.Offline },
                new Album { Quantity = 200, Artist = "Depeche Mode", Title = "Spirit", Status = Status.Online },
            };


            var albumFilter1 = "album => album.Quantity > 20 && album.Quantity < 200"; //works fine
            var albumFilter2 = "album => album.Status == Status.Online"; //Throws exception

            var predicate1 = CreatePredicate<Album>(albumFilter1);
            var predicate2 = CreatePredicate<Album>(albumFilter2);

            var filteredAlbums1 = albums.Where(predicate1).ToList();
            var filteredAlbums2 = albums.Where(predicate2).ToList();

        }

        public static Func<T, bool> CreatePredicate<T>(string command)
        {
            var options = ScriptOptions.Default.AddReferences(typeof(T).Assembly);
            Func<T, bool> predicate = CSharpScript.EvaluateAsync<Func<T, bool>>(command, options).Result;

            return predicate;
        }

    }



    public class Album
    {
        public int Quantity { get; set; }
        public string Title { get; set; }
        public string Artist { get; set; }
        public Status Status { get; set; }
    }

    public enum Status
    {
        Online,
        Offline
    }
    
}

我怎么才能让它和枚举一起工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-12-28 03:13:16

代码语言:javascript
复制
var options = ScriptOptions.Default.AddReferences(typeof(T).Assembly).AddImports(nameof(PredicateParser));

忘记添加“使用命名空间”:)

票数 3
EN

Stack Overflow用户

发布于 2020-12-28 03:09:12

在本例中,如果完全使用命名空间对其进行限定,则不会出现错误。

代码语言:javascript
复制
"album => album.Status == PredicateParser.Status.Online"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65472419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档