2016-06-16 11 views
3

タイプのルールは含まれていません。まず、ビジネスルールエバリュエーターを作成するためにwww.codeeffects.comフレームワークを使用しますが、私の場合、タイプは100% 。与えられたルールセットには、System.Object、mscorlib、

私は私のProof of Conceptメソッドに次のコードを書いています。

public ActionResult Save(RuleModel ruleEditor) 
{ 
    DummyEntitiesGen gen = new DummyEntitiesGen(); 
    Type t = gen.CreateType(); 
    List<dynamic> lista= gen.CreateTypeList(); 
    // At this point the rule model doesn't know which type to use as its source object 
    // We need to "bind" the source type to the rule model 
    ruleEditor.BindSource(t); 

    // Add the rule model to the ViewBag object 
    ViewBag.Rule = ruleEditor; 

    // Make sure that the Rule Area is not empty and the current rule is valid 
    if (ruleEditor.IsEmpty() || !ruleEditor.IsValid(StorageService.LoadRuleXml)) 
    { 
     ViewBag.Message = "The rule is empty or invalid"; 
     return View("Index"); 
    } 
    try 
    { 
     // Save the rule 
     StorageService.SaveRule(
      ruleEditor.Id, 
      ruleEditor.GetRuleXml(), 
      ruleEditor.IsLoadedRuleOfEvalType == null ? 
      true : (bool)ruleEditor.IsLoadedRuleOfEvalType); 

     // Get all rules for Tool Bar and context menus and save it in the bag 
     this.LoadMenuRules(); 

     DynamicEvaluator evaluator = new DynamicEvaluator(ruleEditor.GetRuleXml());    
     //bool success = evaluator.Evaluate(lista, ruleEditor.Id); 

     IEnumerable<dynamic> result = lista.Filter<dynamic>(ruleEditor.GetRuleXml()); 
     //var result = lista.AsQueryable<t>().Filter(ruleEditor.GetRuleXml()); 

     ViewBag.Message = "The rule was saved successfully"; 
    } 
    catch (Exception ex) 
    { 
     ViewBag.Message = ex.Message; 
    } 
    return View("Index"); 
} 

オブジェクトリスタは結構です、私はデバッグ時に見ることができることを作成したダイナミック型のリストを返します。フィルタリングすることになっている行は私にこの例外を与えているが

与えられたルールセットは、タイプのSystem.Objectを持つ任意のルールが含まれていない、mscorlib

答えて

2

GetRuleXml()メソッドを持つXMLを返します。 タイプ属性をソースオブジェクトのタイプに設定します。エンジンはで指定された1に対してインスタンスオブジェクトの種類をチェックし

<rule id='03b33dd0-4389-4ac4-a5aa-bd81fab41e00' eval='true' webrule='4.0.0.8' utc='10/20/2011 4:19:27 PM' 
type='MyApplication.MyClass, MyApplication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=ab44223d08cca81e'> 

コンパイル・フェーズ:あなたのケースでは、gen.CreateType()メソッドによって返される型、例えばの名前になりますタイプと入力します。それらが一致しない場合、その例外が発生します(「与えられたルールセットにはルールが含まれていません...」)。

タイプ属性をクリアまたは削除することで回避できます。コンパイル中に型チェックをバイパスします。

つまり、CodeEffectルールエンジンはではなく、は動的オブジェクトまたはタイプをサポートします。とにかくまだ。

DynamicEvaluatorは、動的オブジェクトまたはタイプとは関係のないレガシークラスです。それは評価されるオブジェクトの各タイプの評価者の辞書を構築し、それらのプロパティとメソッドが一致する限り、さまざまなタイプに対して同じルールを再利用できるようにします。あなたはルール要素からタイプ属性を削除すると

、あなたが、最も可能性の高い別の例外が発生します「System.ArgumentExceptionの: 『Xは』 『のSystem.Object』タイプのメンバーではありません」 。

これは、.NETには動的なタイプがないためです。 Dynamicは、コンパイル時に型チェックをスキップするようにコンパイラに指示し、実行時にいくつかの魔法を追加します。ただし、その下にはObjectとして渡されます。

エンジンは表現を使用してリフレクションではなくルールを作成します。動的の場合はObjectであるため、ルールのXMLで使用されるプロパティやメソッドを見つけることができません。

動的オブジェクト(IDynamicMetaObjectProviderを実装するオブジェクト)のサポートを追加する予定はありますが、時間枠はわかりません。