有没有像“IPermission.TryDemand”这样的方法?

时间:2014-12-08 15:19:57

标签: c# .net

IPermission的当前实现对我来说没有意义,如果我想执行可能抛出SecurityException的操作,那为什么我会调用IPermission.Demand来导致IPermission.Demand那个?

我实际上是使用方法bool来修改程序的流程,这对我来说似乎是最明智的用法,我不需要它来抛出异常,所以是否有类似的方法返回{{1}}?

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;
    }
}