我有两个类,一个叫做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的例子,它使用反射来合并这两个对象,但这也没有用。
答案 0 :(得分:4)
继承规则不允许您将基类(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,
...
}
}
答案 1 :(得分: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的值。