IPermission
的当前实现对我来说没有意义,如果我想执行可能抛出SecurityException
的操作,那为什么我会调用IPermission.Demand
来导致IPermission.Demand
那个?
我实际上是使用方法bool
来修改程序的流程,这对我来说似乎是最明智的用法,我不需要它来抛出异常,所以是否有类似的方法返回{{1}}?
答案 0 :(得分:3)
据我所知,还没有这样的功能 - 您可以将其实现为包装Demand
的扩展方法,如下所示:
public static class IPermissionExtensions
{
public static bool TryDemand(this IPermission permission)
{
try
{
permission.Demand();
}
catch (SecurityException e)
{
return false;
}
return true;
}
}
您可以像这样使用它:
if (somePermission.TryDemand())
{
// ...
}
此方法的唯一问题是捕获异常可能会很慢,尤其是在您的代码中始终要求权限时。
解决方案是在启动应用程序时立即预加载所有安全需求,并存储结果以供以后查找。类似的东西:
public class PermissionManager
{
private Dictionary<IPermission, bool> permissions;
public PermissionManager(IEnumerable<IPermission> permissions)
{
foreach (var permission in permissions)
{
this.permissions.Add(permission, permission.TryDemand());
}
}
public bool HasPermission(IPermission permission)
{
bool value;
if (permissions.TryGetValue(permission, out value))
return value;
else
return false;
}
}