2014-12-08 2 views
0

Текущая реализация IPermission не имеет для меня смысла, если бы я хотел выполнить операцию, которая потенциально могла бы вызвать SecurityException, то почему я должен был бы позвонить IPermission.Demand, чтобы вызвать это?Есть ли способ, например, «IPermission.TryDemand»?

Я использую метод IPermission.Demand, чтобы изменить поток моей программы, который кажется мне наиболее разумным для меня, мне не нужно его бросать исключение, так же есть аналогичный метод, который возвращает bool ?

+0

Нет, увы. Вы можете декомпилировать его сами, чтобы увидеть: это в mscorlib. – Rup

+0

Нет, его опубликованный интерфейс и не содержит такого метода, кроме того, ожидание заключается в том, что Demand будет метаться, если это требование не выполняется. –

+0

[StackOverFlow Previouis Posting] (http://stackoverflow.com/questions/2498787/implementing-ipermission) – MethodMan

ответ

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

Да, накладные расходы на бросание исключений - вот моя проблема. – toplel32

Смежные вопросы