整个预警系统使用C#表达式,会更方便集成,在某些数据集合情况下,依然可以通过lamada进行筛选判断。适应性更好。

 

Roysln从编译器层面支持这种动态写法。

 

从而提出设计,每个动态数据集,应该都是class,那么classname是与任务号有关,但是属性必然需要配置,而且要和sql查询的字段名保持一致。 这样很方便的动态构造T class类型,或List<class>类型。 进而使用委托+lamada表达式处理判断。

 

节省了写大量后缀表达式及表达式判断的繁琐。

 

 

可参考的使用方式:

 

特别要注意条件下数据单元表--DataUnit里面的ReturnTFileds字段的列名列序。作为class的属性。

 

Roysln可以跟属性、生成类class、然后通过反射typeinvoke,执行这个表达式。

 

反射生成的类、参数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);