Данный набор правил не содержит никаких правил с типом System.Object, mscorlib,

Во-первых, я использую платформу www.codeeffects.com для оценки бизнес-правил, но в моем случае мне нужно, чтобы типы были на 100% динамичными.

У меня есть следующий код в моем методе доказательства концепции.

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.

1 ответ

Решение

Метод GetRuleXml() возвращает XML с атрибутом type, установленным на тип исходного объекта. В вашем случае это будет имя типа, возвращаемого методом gen.CreateType(), например:

<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'>

На этапе компиляции механизм проверяет тип объекта экземпляра на соответствие типу, указанному атрибутом type. Если они не совпадают, вы получаете это исключение ("Данный набор правил не содержит никаких правил...").

Вы можете избежать этого, очистив или удалив атрибут type. Это позволяет обойти проверку типов во время компиляции.

Тем не менее, механизм правил CodeEffects не поддерживает динамические объекты или типы. Во всяком случае, пока.

DynamicEvaluator - это устаревший класс, который не имеет ничего общего с динамическими объектами или типами. Он создает словарь оценщиков для каждого типа объекта, который оценивается, позволяя повторно использовать одно и то же правило для различных типов, если их свойства и методы совпадают.

Как только вы удалите атрибут type из элемента rule, вы получите другое исключение, скорее всего "System.ArgumentException:" x "не является членом типа" System.Object "".

Это потому, что в.NET нет такого типа, как динамический. Dynamic просто говорит компилятору пропустить проверку типов во время компиляции и добавляет немного магии во время выполнения. Тем не менее, под ним передается как объект.

Движок использует выражения для построения правила, а не отражения. Поскольку это динамический объект, он не сможет найти какие-либо свойства или методы, используемые в XML правила.

Есть планы добавить поддержку динамических объектов (объектов, реализующих IDynamicMetaObjectProvider), но я не знаю временные рамки.

Другие вопросы по тегам