No se puede echar a MembershipUser clase personalizada (ASP.NET)
-
08-10-2019 - |
Pregunta
Estoy usando el SqlMembershipProvider por defecto, pero he creado una clase MembershipUser personalizado (SoeMembershipUser) porque necesitaba una propiedad "DisplayName". Todo el DisplayName hace es buscar en el nombre del usuario y el formato de manera diferente.
Cuando intento lanzar un MembershipUser a un usuario SoeMembershipUser consigo un InvalidCastException. error exacto es: "No se puede convertir objeto de tipo 'System.Web.Security.MembershipUser' al tipo 'Soe.Tracker.SoeMembershipUser'."
Este es el código que falla:
SoeMembershipUser user = (SoeMembershipUser)Membership.GetUser(username); // invalid cast
También he intentado fundición tarde de este modo:
MembershipUser user = Membershipship.GetUser(username); // ok
...
string displayName = ((SoeMembershipUser)user).DisplayName; // invalid cast
Esta es la clase SoeMembershipUser: NOTA: dejé de constructores al principio, pero ellos añadió más tarde, cuando empecé a tener problemas. La adición de ellos no hizo ninguna diferencia.
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;
}
}
}
Cualquier idea de por qué este reparto es válido? Solo estoy pasando por alto algo simple?
Solución
Está intentando abatido desde una base a una clase derivada (también conocido como una conversión de restricción, a partir de un animal a un perro - pero no cada animal es un perro). Crear un método de extensión, ToMembershipUser, que va a hacer la conversión ya que usted sabe cómo debe proceder y el compilador no lo hace.
Otros consejos
El problema es que está utilizando el SqlMembershipProvider defecto. Usted tendrá que crear un MembershipProvider encargo .
Es probable que pueda llegar a funcionar con sólo extender la SqlMembershipProvider sobre los métodos 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);
}
}