public virtual IPermission Union <TActualResultType>(IPermission target) where TActualResultType : ObjectAccessPermission
 {
     try {
         if (!(target is ObjectAccessPermission))
         {
             throw new ArgumentException("Can't unite anything other than an ObjectAccessPermission or one of its descendants!");
         }
         if (!typeof(ObjectAccessPermission).IsAssignableFrom(typeof(TActualResultType)))
         {
             throw new ArgumentException("Resultant object Type must be an ObjectAccessPermission or one of its descendants!");
         }
         List <ParticularAccessItem>        resultItems = new List <ParticularAccessItem>();
         IEnumerable <ParticularAccessItem> allItems    = AccessItemList.Union(((ObjectAccessPermission)target).AccessItemList);
         if (target is ConditionalObjectAccessPermission)
         {
             resultItems.AddRange(allItems.Distinct());
         }
         else
         {
             foreach (ParticularAccessItem item in allItems)
             {
                 // only process items not already stored in the result set
                 if (!resultItems.Exists(i => i.ObjectType == item.ObjectType && i.Access == item.Access))
                 {
                     // a conditional item (with an actual condition) has precedence over unconditional items...
                     // NOTE: multiple non mutually-exclusive conditional items will be ignored!
                     ConditionalParticularAccessItem conditionalItem = item as ConditionalParticularAccessItem;
                     if (conditionalItem == null || conditionalItem != null && string.IsNullOrEmpty(conditionalItem.Condition))
                     {
                         var duplicateItems = allItems.Where(i => i.ObjectType == item.ObjectType && i.Access == item.Access && !object.ReferenceEquals(i, item));
                         conditionalItem =
                             (ConditionalParticularAccessItem)duplicateItems.FirstOrDefault(i => i is ConditionalParticularAccessItem && !string.IsNullOrEmpty(((ConditionalParticularAccessItem)i).Condition));
                     }
                     if (conditionalItem != null)
                     {
                         resultItems.Add(new ConditionalParticularAccessItem(conditionalItem.ObjectType, conditionalItem.Access, conditionalItem.Modifier, conditionalItem.Condition));
                     }
                     else
                     {
                         resultItems.Add(new ParticularAccessItem(item.ObjectType, item.Access, item.Modifier));
                     }
                 }
             }
         }
         ObjectAccessPermission result = (ObjectAccessPermission)Activator.CreateInstance(typeof(TActualResultType));
         resultItems.ForEach(item => result.AccessItemList.Add(item));
         return(result);
     } catch (Exception ex) {
         throw new Exception(ex.ToString());
     }
 }
        public override void FromXml(SecurityElement element)
        {
            base.FromXml(element);
            condition = null;
            if (element != null)
            {
                foreach (SecurityElement particularAccessItemElement in element.Children)
                {
                    string tempCondition = particularAccessItemElement.Attribute(conditionAttr);
                    if (condition != null && condition != tempCondition)
                    {
                        throw new ArgumentException("Stored particular access item conditions do not match!");
                    }
                    condition = tempCondition ?? condition;
                }
            }
            var newAccessList = AccessItemList.Select(item => new ConditionalParticularAccessItem(item.ObjectType, item.Access, item.Modifier, condition)).ToList();

            AccessItemList.Clear();
            foreach (ParticularAccessItem item in newAccessList)
            {
                AccessItemList.Add(item);
            }
        }