Domanda

Sto utilizzando lo SqlMembershipProvider di default, ma ho creato una classe MembershipUser personalizzato (SoeMembershipUser) perché avevo bisogno di una proprietà "DisplayName". Tutto il DisplayName fa è sguardo al UserName e formattare in modo diverso.

Quando provo a lanciare un MembershipUser a un utente SoeMembershipUser ottengo un InvalidCastException. errore esatto è: "Impossibile oggetto cast di tipo 'System.Web.Security.MembershipUser' di tipo 'Soe.Tracker.SoeMembershipUser'".

Ecco il codice che non riesce:

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

Inoltre ho provato a lanciare in seguito in questo modo:

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

Questa è la classe SoeMembershipUser: NOTA: ho lasciato i costruttori in un primo momento, ma li ha aggiunto più tardi, quando ho iniziato ad avere problemi. L'aggiunta di loro ha fatto alcuna differenza.

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

Qualsiasi idea del perché questo cast non è valido? Sto Situato proprio di fronte qualcosa di semplice?

È stato utile?

Soluzione

Si sta tentando di downcast da una base a una classe derivata (aka una conversione restringimento, come da un animale ad un cane - ma non ogni animale è un cane). Creare un metodo di estensione, ToMembershipUser, che farà la conversione poiché si sa come si dovrebbe procedere e il compilatore non.

Altri suggerimenti

Il problema è che si sta utilizzando lo SqlMembershipProvider di default. Si dovrà creare una MembershipProvider personalizzato .

Probabilmente si può cavarsela con solo estendendo lo SqlMembershipProvider sui metodi 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);
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top