Невозможно преобразовать MembershipUser в пользовательский класс (ASP.NET). - PullRequest
0 голосов
/ 15 октября 2010

Я использую 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 ]

2 голосов
/ 16 октября 2010

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

Возможно, вы сможете обойтись, просто расширив SqlMembershipProvider для методов GetUser.

2 голосов
/ 16 октября 2010

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

...