我有两个类,一个叫做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'.


我还尝试了Rob Harley的示例,该示例使用反射合并了两个对象,但这也不起作用。

最佳答案

继承规则不允许您将基类(MemberModel)转换为子类(CustomPrincipal)。只允许将子类转换回基础。

例如

(DOG, CAT) => ANIMAL

我有一只狗和一只猫,我知道他们都是动物。因此,我可以将狗和猫当做动物。

CAT => ANIMAL => DOG

假设猫是一种动物,但您想将这种动物变成狗,就不能!为什么?因为你真的不知道它是否是狗。

最好的办法是添加构造函数重载或从CustomPrincipal返回MemberModel的方法。

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


要么

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

09-11 10:43