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?

¿Fue útil?

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);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top