将扩展类与基类合并

本文关键字:基类 合并 扩展 | 更新日期: 2023-09-27 18:09:06

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

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

最好是添加一个构造函数重载或一个方法,从MemberModel返回CustomPrincipal

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

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

最后我用正确的方式修复了它。

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的值。