2014-10-08 40 views
1

我如何可以簡化這個代碼,但保留現有功能:嘗試捕捉最後包裝器

var i = new Impersonation(); 
if (i.ImpersonateValidUser()) 
{ 
    try 
    { 
     //privileged code goes here. 
    } 
    catch (Exception ex) 
    { 
     throw; 
    } 
    finally 
    { 
     i.UndoImpersonation(); 
    } 
} 
else 
{ 
    throw new Exception("Impersonation failed."); 
} 

有了這個東西類似於:

using(var i = new Impersonation()) 
{ 
    //privileged code goes here. 
} 

特權碼可以是一個或多個行。

+0

查找到'IDisposable'接口是如何工作的。 – vesan 2014-10-08 00:03:23

+2

一個提示:如果你不使用它,你可以刪除'catch';只用一個try-finally就可以了。 – 2014-10-08 00:05:07

回答

4

到IDisposable模式的替代,你可能不知道的:

Impersonate(() => 
{ 
    //privileged code goes here. 
}); 

實現:

void Impersonate(Action action) 
{ 
    if (i.ImpersonateValidUser()) 
    { 
     try 
     { 
      action(); 
     } 
     finally 
     { 
      i.UndoImpersonation(); 
     } 
    } 
    else 
    { 
     throw new Exception("Impersonation failed."); 
    } 
} 
4

製造Impersonation執行IDisposable,然後將UndoImpersonation()移動到Dispose()