Frage

Ich bin mit dem Standard-SqlMembershipProvider, aber ich habe eine benutzerdefinierte MembershipUser Klasse (SoeMembershipUser) erstellt, weil ich eine „Displayname“ Eigenschaft benötigt. Alle Display tut, ist Blick auf die Username und formatieren Sie es anders.

Wenn ich versuche, eine MembershipUser zu einem SoeMembershipUser Benutzer zu werfen erhalte ich eine InvalidCastException. Genaue Fehler ist: "Kann nicht Gussobjekt des Typs 'System.Web.Security.MembershipUser' to type 'Soe.Tracker.SoeMembershipUser'."

Hier ist der Code, der fehlschlägt:

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

Ich habe auch versucht Gießen später in etwa so:

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

Dies ist die SoeMembershipUser Klasse: HINWEIS: ich die Konstrukteure links zunächst ab, aber sie später hinzugefügt, wenn ich Probleme begonnen haben. Hinzufügen von ihnen machte keinen Unterschied.

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

Jede Idee, warum diese Besetzung ungültig ist? Bin ich etwas einfach nur mit Blick auf?

War es hilfreich?

Lösung

Sie versuchen, von einer Basis zu einer abgeleiteten Klasse zu niedergeschlagenen (auch bekannt als eine Verengung Umwandlung, wie von einem Tier zu einem Hund - aber nicht jedes Tier ist ein Hund). Erstellen Sie eine Erweiterungsmethode, ToMembershipUser, welche die Umwandlung tun, da Sie wissen, wie es weitergehen sollte und der Compiler nicht.

Andere Tipps

Das Problem ist, dass Sie den Standard SqlMembershipProvider verwenden. Sie erhalten einen benutzerdefinierte MembershipProvider erstellen müssen.

Sie können sich wahrscheinlich erhalten, indem mit nur den SqlMembershipProvider auf den GetUser Methoden erstrecken.

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);
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top