2010-07-09 55 views
7

我想在asp.net中擴展IPrincipal,讓我得到我將定義的usertype。我想有可能在控制器asp.net的延伸IPrincipal

string type = User.UserType 

然後在我的擴展方法,我將有一個像

public string UserType() 
{ 
    // do some database access 
    return userType 

} 

我怎麼能做到這一點的方法做到這一點?可能嗎? 謝謝!

+0

你不擴展接口,你實現它。 – 2010-07-09 16:20:38

+0

或者,可以擴展它,但這是別的。這將創建一個新的界面,這是一個基地的超集。 – 2010-07-09 16:21:02

回答

10

您可以擴展方法:

public static string UserType(this IPrincipal principal) { 
    // do some database access 
    return something; 
} 
+0

這會很聰明,但風險很大。 「返回某些東西」部分實際上不得不將其下達到他的實現並呼叫某個財產。如果在任何其他IPrincpal實現上執行,這將會失敗。 – 2010-07-09 16:25:40

+0

該類需要看起來像在哪個擴展方法找到? – twal 2010-07-09 16:26:25

+1

它需要是一個'靜態類'。 – SLaks 2010-07-09 16:27:19

2

這是一個實現IPrincipal的示例自定義類。該類包含一些額外的方法來檢查角色從屬關係,但會顯示一個名爲UserType的屬性,以滿足您的要求。

public class UserPrincipal : IPrincipal 
    { 
    private IIdentity _identity; 
    private string[] _roles; 

    private string _usertype = string.Empty; 


    public UserPrincipal(IIdentity identity, string[] roles) 
    { 
     _identity = identity; 
     _roles = new string[roles.Length]; 
     roles.CopyTo(_roles, 0); 
     Array.Sort(_roles); 
    } 

    public IIdentity Identity 
    { 
     get 
     { 
     return _identity; 
     } 
    } 

    public bool IsInRole(string role) 
    { 
     return Array.BinarySearch(_roles, role) >= 0 ? true : false; 
    } 

    public bool IsInAllRoles(params string[] roles) 
    { 
     foreach (string searchrole in roles) 
     { 
     if (Array.BinarySearch(_roles, searchrole) < 0) 
     { 
      return false; 
     } 
     } 
     return true; 
    } 

    public bool IsInAnyRoles(params string[] roles) 
    { 
     foreach (string searchrole in roles) 
     { 
     if (Array.BinarySearch(_roles, searchrole) > 0) 
     { 
      return true; 
     } 
     } 
     return false; 
    } 

    public string UserType 
    { 
     get 
     { 
     return _usertype; 
     } 
     set 
     { 
     _usertype = value; 
     } 
    } 

    } 

Enjoy!

+0

正確,除了它們無法調用UserType給定對IPrincipal的引用。 – 2010-07-09 16:26:25

2

基本上沒有。您可以實現IPrincipal,其類別爲MyPrincipal,並且該類可以具有UserType屬性,但您必須通過自己類型的引用訪問該實例才能訪問該實例,而不是通過接口引用。

編輯

擴展方法可以工作,但前提是你是絕對肯定你永遠不會把它的東西,實現了IPrincipal但不是你自己的類的實例。

+0

謝謝。我會考慮IPrincipal在其他地方實施的可能性。我不確定它是否會應用於我的應用程序。我不確定哪些情況會導致這種情況。但如果是這樣的話,這對我來說也是有用的。謝謝你,先生! – twal 2010-07-09 16:33:42

+0

@twal:通常,框架會給你一個IPrincipal,它的實現是來自該框架的一些類。只要你確定這不會發生,一個擴展方法將滿足你的需求。 – 2010-07-09 16:45:01

+0

謝謝史蒂文! – twal 2010-07-09 21:06:57

3

當然。讓你的類實現的IPrincipal:

public class MyPrinciple : IPrincipal { 
    // do whatever 
} 

擴展方法:

public static string UserType(this MyPrinciple principle) { 
    // do something 
} 
+0

與SLaks的答案相同的問題:「做某事」將涉及向下轉播,這可能會失敗。 – 2010-07-09 16:27:18