C#表达式CLI直接执行表达式
整个预警系统使用C#表达式,会更方便集成,在某些数据集合情况下,依然可以通过lamada进行筛选判断。适应性更好。
而Roysln从编译器层面支持这种动态写法。
从而提出设计,每个动态数据集,应该都是class,那么classname是与任务号有关,但是属性必然需要配置,而且要和sql查询的字段名保持一致。 这样很方便的动态构造T class类型,或List<class>类型。 进而使用委托+lamada表达式处理判断。
节省了写大量后缀表达式及表达式判断的繁琐。
可参考的使用方式:
特别要注意条件下数据单元表--DataUnit里面的ReturnTFileds字段的列名列序。作为class的属性。
Roysln可以跟属性、生成类class、然后通过反射type搞invoke,执行这个表达式。
反射生成的类、参数N个作为属性,动态生成类,放入线程安全的字典里面。
条件作为参数
var script = _conditionScripts.GetOrAdd(condition, con =>
CSharpScript.Create<bool>(condition, options: scriptOptions, globalsType: param?.GetType()).CreateDelegate()
);
var result = await script.Invoke(param);
CSharpScript.Create 是Roslyn的语法。加载语句。
Delegate.CreateDelegate 方法
创建指定类型的委托,该委托表示指定类的指定静态方法。此方法仅为静态方法创建委托。
委托静态方法内的具体执行,就是X属性>Y属性就返回。
案例:
string code1 = @" public class ScriptedClass { public string HelloWorld { get; set; } public ScriptedClass() { HelloWorld = ""Hello Roslyn!""; } }"; // 通过Run方法和ContinueWityAsync方法分别执行了两段脚本 var script1 = CSharpScript.RunAsync(code1).Result; var result1 = script1.ContinueWithAsync<string>("new ScriptedClass().HelloWorld").Result; Console.WriteLine(result1.ReturnValue);
|