public virtual ConditionalObjectAccessPermission FilterUnfitItems(object contextObject)
        {
            try {
                Type objectType = contextObject.GetType();
                //IObjectSpace objectSpace = ObjectSpace.FindObjectSpace(contextObject);
                IObjectSpace objectSpace = ObjectSpace.FindObjectSpaceByObject(contextObject);
                EvaluatorContextDescriptor descriptor = objectSpace != null?objectSpace.GetEvaluatorContextDescriptor(objectType) : new EvaluatorContextDescriptorDefault(objectType);

                ConditionalObjectAccessPermission result = new ConditionalObjectAccessPermission();
                foreach (ConditionalParticularAccessItem item in AccessItemList)
                {
                    bool itemFits = string.IsNullOrEmpty(item.Condition);
                    if (!itemFits && item.ObjectType == objectType)
                    {
                        LocalizedCriteriaWrapper wrapper = new LocalizedCriteriaWrapper(objectType, item.Condition);
                        wrapper.UpdateParametersValues(contextObject);
                        ExpressionEvaluator evaluator = new ExpressionEvaluator(descriptor, wrapper.CriteriaOperator);
                        itemFits = evaluator.Fit(contextObject);
                    }
                    if (itemFits)
                    {
                        result.AccessItemList.Add(item);
                    }
                }
                return(result);
            } catch (Exception ex) {
                throw new Exception(ex.ToString());
            }
        }
        public override IPermission Copy()
        {
            ConditionalObjectAccessPermission result = new ConditionalObjectAccessPermission {
                ObjectType = ObjectType
            };

            foreach (ConditionalParticularAccessItem item in AccessItemList)
            {
                result.AccessItemList.Add(item);
            }
            return(result);
        }
 static ObjectAccessPermission MergeTargetWithConditionalPermission(ObjectAccessPermission targetPermission, SecurityContextList contexts)
 {
     try {
         if (contexts.TargetObjectContext != null && contexts.TargetObjectContext.TargetObject != null)
         {
             object targetObject = contexts.TargetObjectContext.TargetObject;
             ConditionalObjectAccessPermission validatedConditionalPermission = ConditionalPermission.FilterUnfitItems(targetObject);
             return((ObjectAccessPermission)validatedConditionalPermission.Union <ObjectAccessPermission>(targetPermission));
         }
         return(targetPermission);
     } catch (Exception ex) {
         throw new Exception(ex.ToString());
     }
 }