Question

J'utilise le SqlMembershipProvider par défaut, mais je l'ai créé une classe MembershipUser personnalisée (SoeMembershipUser) parce que je avais besoin d'une propriété « DisplayName ». Tout le DisplayName fait est de regarder le UserName et le format différemment.

Lorsque je tente de jeter un MembershipUser à un utilisateur de SoeMembershipUser je reçois un InvalidCastException. erreur exacte est: "Incapable de l'objet moulé du type 'System.Web.Security.MembershipUser' du type 'Soe.Tracker.SoeMembershipUser'."

Voici le code qui échoue:

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

J'ai aussi essayé casting plus tard comme ceci:

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

Voici la classe SoeMembershipUser: REMARQUE: je l'ai laissé les constructeurs au début, mais les a ajouté plus tard quand j'ai commencé à avoir des problèmes. En les ajoutant ne fait aucune différence.

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

Toute idée pourquoi ce casting est invalide? Est-ce que je viens de méconnais simple quelque chose?

Était-ce utile?

La solution

Vous essayez de downcaster d'une base à une classe dérivée (alias une conversion de rétrécissement, comme d'un animal à un chien - mais pas tous les animaux est un chien). Créer une méthode d'extension, ToMembershipUser, qui fera la conversion puisque vous savez comment il doit procéder et le compilateur ne fonctionne pas.

Autres conseils

Le problème est que vous utilisez la SqlMembershipProvider par défaut. Vous devrez créer un MembershipProvider personnalisé .

Vous pouvez probablement vous en tirer avec juste l'extension de la SqlMembershipProvider sur les méthodes de GetUser.

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);
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top