DateTime в roslyn CSharpScript возвращает «ожидание»; - PullRequest
0 голосов
/ 25 октября 2019

Использование DateTime в средстве оценки roslyn CSharpScript возвращает код ошибки «Ожидается»;в то время как строки работают нормально.

Использование Visual Studio 2019 с Microsoft.CodeAnalysis.Common и Microsoft.CodeAnalysis.CSharp.Scripting 3.3.1

Понимание того, что для оценки требуется конфигурация, добавлена ​​сборка DateTime вместе ссборка пользовательского класса.

public class Install
    {
        public int InstallId { get; set; }
        public int RegistrationId { get; set; }
        public int EnvironmentId { get; set; }
        public DateTime SubmitDateTime { get; set; }
        public string SubmitIdentity { get; set; }
        public DateTime TargetDateTime { get; set; }
        public string InstallerIdentity { get; set; }
        public DateTime? StartDateTime { get; set; }
        public DateTime? StopDateTime { get; set; }
        public string Status { get; set; }
    }
string queryText;
var fooFuture = DateTime.Now.AddDays(7);
var fooPast = DateTime.Now.AddDays(-7);

switch (TimeFrame)
  {
    case "future":  // fails (expected) //
       queryText = $"i => i.TargetDateTime < fooFuture";
       break;
    case "current":  // works //
       queryText = "i => i.Status == \"In Progress\"";
       break;
    case "past":   // fails with interpolation -- expecting ; //
       queryText = $"i => i.TargetDateTime > {fooPast}";
       break;
    default:      // fails with DateTime -- expecting ; //
       queryText = $"i => i.TargetDateTime < {DateTime.Now.AddDays(15)} && i.TargetDateTime > {DateTime.Now.AddDays(-15)}";
       break;
   }

ScriptOptions options = ScriptOptions.Default
  .AddReferences(typeof(Install).Assembly)
  .AddReferences(typeof(System.DateTime).Assembly);

Func<Install, bool> queryTextExpression = await CSharpScript.EvaluateAsync<Func<Install, bool>>(queryText, options);

Не могу понять, почему базовый объект DateTime вызывает проблемы.

Строка разрешается в "i => i.TargetDateTime > 10/25/2019 11:00:00 AM". Заключение в кавычки вызывает интерпретацию строкитакое разбор? Не знаете, как обрабатывать символы в объекте DateTime?

1 Ответ

0 голосов
/ 25 октября 2019

Проблема, как вы сказали, - строка разрешается до "i => i.TargetDateTime > 10/25/2019 11:00:00 AM", что является недопустимым кодом C #. Даже если вы добавили кавычки, вы не можете напрямую сравнить DateTime с string

В конечном счете, вам либо нужно сравнивать объекты одного типа. Либо string до string, DateTime до DateTime, long до long и т. Д. Я предпочитаю сохранять их как DateTime объекты.

Таким образом, вам необходимо построитьDateTime в правой части выражения.

Один из способов - использовать конструктор DateTime, например:

queryText = $"i => i.TargetDateTime > new System.DateTime({fooPast.Ticks}, System.DateTimeKind.{fooPast.Kind})";

Другой, возможно, более чистый механизмчерез встроенные двоичные методы сериализации, которые учитывают как Ticks, так и Kind в одном значении:

queryText = $"i => i.TargetDateTime > System.DateTime.FromBinary({fooPast.ToBinary()})";
...