Как выполнить / запустить код из строковой переменной во время выполнения - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь выполнить код из строковой переменной, чтобы получить элемент из словаря

Я пытался использовать CSharpCodeProvider следующим образом:

var text = "IconDescription";
text = "\"" + text + "\"";
var field = "Outcome[" + text + "].Value";
field = "\"" + field + "\"";

CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler()

parameters.GenerateExecutable = true;

CompilerResults results = icc.CompileAssemblyFromSource(parameters, field)
var dataTest = JsonConvert.DeserializeObject<DictionaryOutcome.Rootobject>(jsonText);

var t = new List<Outcome>();

var defaultOutcome = dataTest.Response.Outcome.KeyValueOfstringOutcomepQnxSKQu.Select(item => new Outcome
                {
                    DataType = item.Value.DataType,
                    Value = item.Value.Value1,
                    Field = item.Key
                }).ToList();

                defaultOutcome.ToList().ForEach(item =>
                {
                    t.Add(item);
                });


значением переменной поля является Outcome ["IconDescription"]. Значение, и я хочу выполнить этот код, чтобы получить значение из словаря Outcome, используя ключ "IconDescription", и получить значение.

Возможно ли это?

Я пробовал следующее:

var scriptOptions = ScriptOptions.Default
                    .WithReferences(typeof(Dictionary<string, Outcome>).FullName)
                    .WithImports("Outcome");
var scripts = CSharpScript.Create<object>(field, scriptOptions);

var resultsx = scripts.RunAsync(null, CancellationToken.None).Result;

И я получаю эту ошибку:

ошибка CS0246: не удалось найти тип или имя пространства имен 'Outcome' (отсутствует директива using или ссылка на сборку?)

1 Ответ

0 голосов
/ 29 марта 2019

Я изо всех сил пытаюсь даже догадаться, что вы пытаетесь сделать, но для начала подумайте, что вы на самом деле делаете, пытаясь скомпилировать эту строку, которую вы строите.

Outcome["SomeValue"].Value даже не близкочтобы быть действительным кодом C #:

  • он не имеет области действия
  • он не имеет точки входа
  • он не импортирует пространства имен
  • это не такзавершается с;
  • символом Outcome не определено

Вы компилируете это в исполняемый файл, поэтому я не вижу, как он мог иметь какие-либо знания осписок результатов, полученных в результате десериализации контента JSON, где вы не указали, откуда вы это получаете.

Вы не указали никаких доказательств, объясняющих, почему вам нужно такое сложное решение, чтобы просто извлечьнекоторые значения из JSON, поэтому простым решением может быть использование встроенных функций Newtonsoft.Json:

dataTest[0] выбирает первый элемент в массиве, когда объект json является массивом;

dataTest[0]["Outcome"] выбирает свойство Outcome первого объекта, который сам может быть объектом

dataTest[0]["Outcome"]["Value"] выбирает свойство Value из Outcome

ВсеСтроковые индексы могут быть известны только во время выполнения и храниться в переменных.Я не понимаю, зачем вам вообще нужен какой-либо сценарий.

...