CSharpScript.EvaluateAsync не распознает перечисление

#c# #roslyn

#c# #рослин

Вопрос:

Я использую CSharpScript.EvaluateAsync для генерации предиката из строки. Используя переменные string и int, он работает нормально, но если я попытаюсь передать переменную enum в строку для преобразования, она выдает ошибку:

Сообщение «(1,26): ошибка CS0103: имя «Статус» не существует в текущем контексте» строка

Вот автономное воспроизведение:

 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 amp;amp; 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).Resu<

            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
    }
    
}
 

Как я могу заставить его работать с перечислениями?

Ответ №1:

 var options = ScriptOptions.Default.AddReferences(typeof(T).Assembly).AddImports(nameof(PredicateParser));
 

Вы забыли добавить «использование пространства имен» 🙂

Ответ №2:

В этом случае ошибки нет, если вы полностью определяете ее с помощью пространства имен.

 "album => album.Status == PredicateParser.Status.Online"