如何在运行时从字符串变量执行/运行代码

时间:2019-03-29 11:35:14

标签: c# roslyn

我正在尝试执行字符串变量中的代码以从字典中获取项目

我尝试像这样使用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”]。Value,我想执行此代码以使用“ IconDescription”键从Outcome字典中获取该值,并获取该值。

这可能吗?

我尝试了以下方法:

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:找不到类型或名称空间名称'结果'(您是否缺少using指令或程序集引用?)

1 个答案:

答案 0 :(得分:0)

我甚至都在猜测您要做什么,但作为一个入门者,请尝试通过编译正在构造的字符串来考虑您的实际工作。

Outcome["SomeValue"].Value甚至不是有效的C#代码:

  • 没有范围
  • 它没有入口点
  • 它不导入任何名称空间
  • 它不以;结尾。
  • 未定义符号Outcome

您正在将其编译为可执行文件,因此我看不到它如何了解反序列化JSON内容所带来的结果列表,而您尚未指定从何处获取此结果

您还没有指定任何证据来解释为什么您需要这样一种精心设计的解决方案来仅从JSON中提取某些值的原因,因此一种直接的解决方案可能是使用Newtonsoft.Json的内置功能:

dataTest[0]在json对象为数组时选择数组中的第一个元素;

dataTest[0]["Outcome"]选择第一个对象的属性Outcome,该对象本身可能是一个对象

dataTest[0]["Outcome"]["Value"]选择Value的属性Outcome

这里所有的字符串索引只能在运行时知道并保存在变量中。我不明白为什么您需要完全执行任何脚本操作。