Невозможно преобразовать MembershipUser в пользовательский класс (ASP.NET).

Я использую SqlMembershipProvider по умолчанию, но я создал собственный класс MembershipUser (SoeMembershipUser), потому что мне нужно свойство "DisplayName". Все, что делает DisplayName, это смотрит на UserName и форматирует его по-другому.

Когда я пытаюсь привести пользователя MembershipUser к пользователю SoeMembershipUser, я получаю исключение InvalidCastException. Точная ошибка: "Невозможно привести объект типа" System.Web.Security.MembershipUser "к типу" Soe.Tracker.SoeMembershipUser "."

Вот код, который не работает:

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

Я также попробовал кастинг позже так:

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

Вот класс SoeMembershipUser: ПРИМЕЧАНИЕ. Сначала я остановил конструкторы, но добавил их позже, когда у меня возникли проблемы. Добавление их не имеет значения.

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

Есть идеи, почему этот актерский состав недействителен? Я просто пропускаю что-то простое?

2 ответа

Решение

Вы пытаетесь понизить рейтинг от базового до производного класса (он же сужается, как от животного к собаке - но не каждое животное - собака). Создайте метод расширения ToMembershipUser, который будет выполнять преобразование, поскольку вы знаете, как это должно происходить, а компилятор - нет.

Проблема в том, что вы используете SqlMembershipProvider по умолчанию. Вам нужно будет создать пользовательский MembershipProvider.

Вы, вероятно, можете обойтись, просто расширив SqlMembershipProvider для методов 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);
    }
}
Другие вопросы по тегам