2016-09-28 116 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

我不知道有任何编程机密会自动为您执行任何操作。最简单的方法是创建构造函数或转换器方法。 –