non può lanciare MembershipUser alla classe personalizzata (ASP.NET)
-
08-10-2019 - |
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?
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);
}
}