public override IPermission Union(IPermission target)
{
ResourcePermissionBase rpb = Cast(target);
if (rpb == null)
{
return(Copy());
}
if (IsEmpty() && rpb.IsEmpty())
{
return(null);
}
if (rpb.IsEmpty())
{
return(Copy());
}
if (IsEmpty())
{
return(rpb.Copy());
}
bool unrestricted = (IsUnrestricted() || rpb.IsUnrestricted());
ResourcePermissionBase result = CreateFromType(this.GetType(), unrestricted);
// strangely unrestricted union doesn't process the elements (while intersect does)
if (!unrestricted)
{
foreach (ResourcePermissionBaseEntry entry in _list)
{
result.AddPermissionAccess(entry);
}
foreach (ResourcePermissionBaseEntry entry in rpb._list)
{
// don't add twice
if (!result.Exists(entry))
{
result.AddPermissionAccess(entry);
}
}
}
return(result);
}