2016-09-28 53 views
2

我有兩個類,一個叫做MemberModel,另一個叫做CustomPrincipal。 CustomPrincipal類繼承了MemberModel類。使用基類合併擴展類

的MemberModel類看起來是這樣的:

namespace example.Models 
{ 
    public class MemberModel 
    { 
     [Required] 
     public string Username { get; set; } 
     [Required] 
     public string Password { get; set; } 

     public bool Remember { get; set; } 
    } 
} 

的CustomPrincipal類看起來是這樣的:

namespace example.Examples 
{ 
    public class CustomPrincipal : MemberModel, IPrincipal 
    { 
     public CustomPrincipal(IIdentity identity) 
     { 
      this.Identity = identity; 
     } 

     public IIdentity Identity { get; private set; } 

     public bool IsInRole(string role) { return false; } 
    } 
} 

在下面的例子中,你看到兩個班MemberModel什麼充滿了用戶名,密碼和記住和CustomPrincipal類什麼是充滿了IIDentity信息,但不是用戶名,密碼和記住。

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
MemberModel memberModel = serializer.Deserialize<MemberModel>(authTicket.UserData); 

IIdentity user = HttpContext.Current.User.Identity; 
CustomPrincipal customPrincipal = new CustomPrincipal(user); 

現在我想要將MemberModel中的屬性與CustomPrincipal的屬性合併。

我已經嘗試了多種東西,但沒有一個正在工作。我嘗試將MemberModel轉換爲CustomPrincipal,但不幸的是這不起作用(見下文)。

customPrincipal = (CustomPrincipal) memberModel; 
Unable to cast object of type 'example.Examples.Models.MemberModel' to type 'example.Examples.CustomPrincipal'. 

我也tryed的例子的Rob Harley,使用反射來合併這兩個對象,但是這也沒有工作。

+2

到底您期望達到的結果究竟是什麼? –

+0

@MongZhu編輯的問題:) –

+2

恐怕最好的解決方案是在'CustomPrincipal'中編寫一個方法,它將'MemberModel'作爲參數,並手動設置這些屬性或使構造函數接受'MemberModel' – slawekwin

回答

0

最後,我已經用正確的方式反射固定它。

PropertyInfo[] props = typeof(MemberModel).GetProperties(); 
foreach (PropertyInfo prop in props) 
{ 
    if (prop.Name != "Password") 
     customPrincipal.GetType().GetProperty(prop.Name).SetValue(customPrincipal, serializeModel.GetType().GetProperty(prop.Name).GetValue(memberModel, null) as string); 
} 

首先我們從MemberModel所有化子性質,那麼我們遍歷所有這些特性,並通過MemberModel的值設置customPrincipal的價值。

4

繼承規則將不允許您將基類(MemberModel)投射到子類(CustomPrincipal)中。你只允許投一個子類回爲基..

在例子中,

(DOG, CAT) => ANIMAL

我有一隻狗和一隻貓,我知道,他們兩個是動物。因此,我可以把狗和貓當作動物來對待。

CAT => ANIMAL => DOG

比方說,貓是動物,但是要打開該動物爲一隻狗,你不能!爲什麼?因爲你真的不知道它是不是一隻狗。

最好你可以做的是添加一個構造函數重載或從MemberModel返回CustomPrincipal的方法。

public CustomPrincipal(MemberModel model) 
{ 
    this.Username = model.Username; 
    ... 
} 

public static CustomPrincipal FromMember(MemberModel model) 
{ 
    return new CustomPrincipal() 
    { 
     Username = model.Username, 
     ... 
    } 
} 
+0

我的問題是如何自動做到這一點,如果我將額外的屬性添加到MemberModel我不想將此也添加到CustomPrincipal。 –

+0

我不知道有任何編程機密會自動爲您執行任何操作。最簡單的方法是創建構造函數或轉換器方法。 –