代码之家  ›  专栏  ›  技术社区  ›  Rick

无法将MembershipUser强制转换为自定义类(ASP.NET)

  •  0
  • Rick  · 技术社区  · 14 年前

    我使用的是默认的SqlMembershipProvider,但是我创建了一个自定义的membershippuser类(soembershippuser),因为我需要一个“DisplayName”属性。DisplayName所做的就是查看用户名并以不同的格式设置它。

    当我尝试将MembershipUser强制转换为soembershipuser用户时,会得到一个InvalidCastException。准确的错误是: “无法将'System.Web.Security.MembershipUser'类型的对象转换为'Soe.Tracker.soembershipuser'类型。”

    下面是失败的代码:

    SoeMembershipUser user = (SoeMembershipUser)Membership.GetUser(username); // invalid cast
    

    后来我也试过这样的演员:

    MembershipUser user = Membershipship.GetUser(username); // ok
    ...
    string displayName = ((SoeMembershipUser)user).DisplayName; // invalid cast
    

    以下是soembershipuser类: 注意:一开始我没有使用构造函数,但后来当我遇到问题时添加了它们。加上它们没什么区别。

    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;
            }
        }
    }
    

    知道这个演员为什么无效吗?我是不是忽略了一些简单的事情?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Antony    14 年前

    你试图从一个基类向下转换为一个派生类(又称为一个变窄的转换,如从动物到狗——但不是所有的动物都是狗)。创建一个扩展方法tombershipuser,它将执行转换,因为您知道它应该如何进行,而编译器却不知道。

        2
  •  2
  •   bendewey    14 年前

    问题是您正在使用默认的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);
        }
    }