我正在使用默认的SqlMembershipProvider,但是我创建了一个自定义的MembershipUser类(SoeMembershipUser),因为我需要一个“DisplayName”属性。所有DisplayName都会查看UserName并以不同的方式对其进行格式化。
当我尝试将MembershipUser强制转换为SoeMembershipUser用户时,我得到一个InvalidCastException。确切的错误是: “无法将'System.Web.Security.MembershipUser'类型的对象强制转换为'Soe.Tracker.SoeMembershipUser'。”
以下是失败的代码:
SoeMembershipUser user = (SoeMembershipUser)Membership.GetUser(username); // invalid cast
我之后也尝试过这样做:
MembershipUser user = Membershipship.GetUser(username); // ok
...
string displayName = ((SoeMembershipUser)user).DisplayName; // invalid cast
以下是SoeMembershipUser类: 注意:我首先离开了构造函数,但是在我开始遇到问题时添加它们。添加它们没有任何区别。
public class SoeMembershipUser : MembershipUser
{
public SoeMembershipUser()
: base()
{
}
public SoeMembershipUser(string providerName, string name,
Object providerUserKey, string email, string passwordQuestion,
string comment, bool isApproved, bool isLockedOut,
DateTime creationDate, DateTime lastLoginDate,
DateTime lastActivityDate, DateTime lastPasswordChangedDate,
DateTime lastLockoutDate)
: base(providerName, name, providerUserKey, email,
passwordQuestion, comment, isApproved, isLockedOut,
creationDate, lastLoginDate, lastActivityDate,
lastPasswordChangedDate, lastLockoutDate)
{
}
public virtual string DisplayName
{
get
{
if (UserName.Contains("@"))
return UserName.Substring(0, UserName.IndexOf("@"));
return UserName;
}
}
}
知道为什么这个演员表无效?我只是忽略了一些简单的事情吗?
答案 0 :(得分:2)
你正试图从一个基础向下传播到派生类(也就是一个缩小的转换,从动物到狗 - 但不是每个动物都是狗)。创建一个扩展方法ToMembershipUser,它将执行转换,因为您知道它应该如何继续,而编译器不会。
答案 1 :(得分:2)
问题是您使用的是默认的SqlMembershipProvider。您必须创建custom MembershipProvider。
你可以通过在GetUser方法上扩展SqlMembershipProvider来实现。
public class SoeMembershipProvider : SqlMembershipProvider
{
public override MembershipUser GetUser(object providerUserKey, bool userIsOnline)
{
var sqlMembershipUser = base.GetUser(providerUserKey, userIsOnline);
return new SoeMembershipUser(sqlMembershipUser);
}
public override MembershipUser GetUser(string username, bool userIsOnline)
{
var sqlMembershipUser = base.GetUser(username, userIsOnline);
return new SoeMembershipUser(sqlMembershipUser);
}
}