将扩展类与基类合并

Yan*_*eld 2 c# merge inheritance class base-class

我有两个类,一个叫做 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在下面的示例中,您会看到两个类 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);
Run Code Online (Sandbox Code Playgroud)

现在我希望将 MemberModel 的属性与 CustomPrincipal 的属性合并。

我尝试了多种方法,但都没有奏效。我尝试将 MemberModel 转换为 CustomPrincipal,但不幸的是这不起作用(见下文)。

customPrincipal = (CustomPrincipal) memberModel;
Unable to cast object of type 'example.Examples.Models.MemberModel' to type 'example.Examples.CustomPrincipal'.
Run Code Online (Sandbox Code Playgroud)

我也尝试过Rob Harley的例子,它使用反射来合并两个对象,但这也不起作用。

jeg*_*ado 5

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

例如,

(DOG, CAT) => ANIMAL

我有一只狗和一只猫,我知道它们都是动物。因此,我可以把狗和猫当作动物来对待。

CAT => ANIMAL => DOG

假设猫是一种动物,但你想把那只动物变成狗,你不能!为什么?因为你真的不知道它是不是一只狗。

您能做的最好的事情是添加一个构造函数重载或一个CustomPrincipal从 a返回 a 的方法MemberModel

public CustomPrincipal(MemberModel model)
{
    this.Username = model.Username;
    ...
}
Run Code Online (Sandbox Code Playgroud)

或者

public static CustomPrincipal FromMember(MemberModel model)
{
    return new CustomPrincipal()
    {
        Username = model.Username,
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)