1

我尝试评估这条规则

<?xml version="1.0" encoding="utf-8"?>
<codeeffects
    xmlns="http://codeeffects.com/schemas/rule/41"
    xmlns:ui="http://codeeffects.com/schemas/ui/4">
    <rule id="PerformCalculation" webrule="5.0.9.6" utc="2020-11-23T13:13:42.3010" type="domain_product.Configs.WorkflowEngine.MicroflowModel, domain-product, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" eval="false">
        <definition>
            <if>
                <clause>
                    <rule id="40494eaf-4de0-4b3b-85b9-1c73473c2660" operator="doesNotExist">
                        <property name="e536c617_2636_47e8_93bb_66bb6c7fe3c0" />
                    </rule>
                </clause>
                <then>
                    <set>
                        <property name="775e6e9c_154f_45b3_9360_3d0a154ee19d" />
                        <value>test1</value>
                    </set>
                </then>
            </if>
        </definition>
        <format>
            <lines />
        </format>
    </rule>
    <rule id="40494eaf-4de0-4b3b-85b9-1c73473c2660" webrule="5.0.9.6" utc="2020-11-23T13:13:42.3010" type="transformify_template_api_factory_product.Domain.Model_cb958c7f_3681_40c5_573c_08d88fb1664f, DynamicAssembly.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" eval="true">
        <definition>
            <condition type="equal">
                <property name="Godini" />
                <value type="numeric">50</value>
            </condition>
        </definition>
        <format>
            <lines />
        </format>
    </rule>
</codeeffects>

课程是

public class Model_710e265b_d07c_4c1b_573d_08d88fb1664f 
    {
        [Field(DisplayName = "Ime")]
        public string Ime { get; set; }

        [Field(DisplayName = "Prezime")]
        public string Prezime { get; set; }

        [Field(DisplayName = "Godini")]
        public int Godini { get; set; }
    }

public class MicroflowModel
    {
        [Field(DisplayName = "Variables -> Persons")]
        public List<Model_710e265b_d07c_4c1b_573d_08d88fb1664f> e536c617_2636_47e8_93bb_66bb6c7fe3c0{ get; set; }

        [Field(DisplayName = "Variables -> var1")]
        public string 775e6e9c_154f_45b3_9360_3d0a154ee19d { get; set; }
    }

Model_710e265b_d07c_4c1b_573d_08d88fb1664f 是名为“DynamicAssembly.dll”的程序集的一部分,该程序集未加载到应用程序域中,但该类存在。

MicroflowModel类是动态创建的程序集的一部分,由 TypeBuilder 生成。

在评估没有 List 属性的对象时,评估过程是可以的。

使用“DynamicAssembly.dll”程序集中的列表评估对象时(如示例中所示),Evaluator构造函数失败并显示以下消息:

Value cannot be null. (Parameter 'type')

和堆栈跟踪:

at System.Linq.Expressions.Expression.Validate(Type type, Boolean allowByRef)
   at System.Linq.Expressions.Expression.Parameter(Type type, String name)
   at CodeEffects.Rule.Core.ExpressionBuilderBase.BuildRule(XElement element)
   at CodeEffects.Rule.Core.ExpressionBuilderBase.Build(XElement element)
   at CodeEffects.Rule.Core.ExpressionBuilderBase.BuildIfRule(XElement element)
   at CodeEffects.Rule.Core.ExpressionBuilderBase.Build(XElement element)
   at CodeEffects.Rule.Core.ExpressionBuilderBase.Build(IEnumerable`1 elements)
   at CodeEffects.Rule.Core.ExpressionBuilderBase.GetSafeExpressionBody(XElement rule, Boolean addSourceNullCheck)
   at CodeEffects.Rule.Core.ExpressionBuilder.GetPredicateExpression(XElement rule)
   at CodeEffects.Rule.Core.Evaluator.CompileRule(XElement rule)
   at CodeEffects.Rule.Core.EvaluatorBase..ctor(Type sourceType, String rulesetXml, EvaluationParameters parameters, IFlexDataProvider provider)
   at CodeEffects.Rule.Core.Evaluator..ctor(Type sourceType, String rulesetXml, EvaluationParameters parameters)
   at ...

请帮忙

4

1 回答 1

1

您需要使该课程可用。ExpressionBuilder 必须能够使用 Type.GetType() 加载内部规则中引用的类型(id="40494eaf-4de0-4b3b-85b9-1c73473c2660"),以便构建表达式树。

它在内部调用

Type ruleType = Type.GetType("transformify_template_api_factory_product.Domain.Model_cb958c7f_3681_40c5_573c_08d88fb1664f, DynamicAssembly.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");

由于找不到它,结果为 null 并且下一次调用 Expression.Parameter() 失败。

于 2020-11-25T04:31:14.070 回答