合并不同类型的权限通常来说是有意义的。为此,CLR提供了PermissionSet类型,用于聚集任意类型的权限对象。一个PermissionSet对象对每一种权限类型最多持有一个权限对象。加入一个已经为权限集所持有的类型的权限对象,会导致这个权限对象和已经持有的权限对象合并起来。例如,考察下面的c#方法:
static void DoIt(){
FileIOPermissionAccess all=FileIOPermissionAccess.AllAAccess;
SecurityPermissionFlag f1=SecurityPermissionFlag.Execution;
SecurityPermissionFlag f2=SecurityPermissionFlag.SkipVerification;
PermissionSet ps=new PermissionSet(PermissionState.None);
ps.AddPermission(new SecurityPermission(f1));
ps.AddPermission(new SecurityPermission(f2));
ps.AddPermission(new FileIOPermission(all,@”C:\etc”));
}
在这个方法末尾,刚刚创建的权限集容纳有两个权限对象,一个类型是FileIOPermission,另一个类型是SecurityFermission,它们都允许Execution和SkipVerification。
PermissionSet类型支持IPermission
接口中三个面向集合的操作(Union、Intersect和IsSubsetof)。PermissionSet对这三个方法的实现仅仅是遍历权限对象个体并对第二个权限集中匹配的权限对象执行集合操作,如图9.6所示。
对PermissionSet对象执行集合操作是很平常的。例如,考虑下面的c#代码:
static void DoIt()
{
FileIOPermissionAccess all=FileIOPermissionAccess.AllAccess;
SecurityPermissionFlag f1=SecurityPermissionFlag.Execution;
SecurityPermissionFlag f2=SecurityPermissionFlag.SkipVerification;
PermissionSet ps1=new PermissionSet(null);
PermissionSet ps2=new PermissionSet(null);
PermissionSet ps3=new PermissionSet(null);
ps1.AddPermission(new SecurityPermission(f1));
ps2.AddPermission(new SecurityPermission(f2));
ps2.AddPermission(new FileIOPermission(all,@”C:\etc”));
}
这段代码与先前例子的代码生成同样的权限集,虽然方式不那么直接。
权限集还可以授予无限制的限制,这是通过传递PermissionStateUnreatricted到权限集的构造器中实现的;当一个权限集被授予无限制的权限时,假如权限类型支持IUnrestrictedPermission接口的话,它就隐含地支持所有可能权限类型里的所有可能操作。一个被授予了无限制权限的权限集,并未隐式地授予任何不支持IUnrestrictedPermission接口的权限类型(例如,标识权限)的权利,然而,在无限制的权限集上调用AddPermission方法显式地授予这些专门的权限是合法的。