Вопрос

Я использую SQLMembershipDROVIDER по умолчанию, но я создал Custom Custom NuralhiMetiver Class (SOMEMBERSIVERSER), потому что мне нужно было свойство «DisplayName». Все отображает имя пользователя, это посмотрите на имя пользователя и формат его по-разному.

Когда я пытаюсь отбрасывать членство в пользователю SummershistUSER, я получаю InvalidCastException. Точная ошибка: «Невозможно отличить объект типа» System.Web.security. Мбитилище к типу «SOE.Tracker.soembersister».

Вот код, который не удается:

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

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

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

Вот класс SOMEMBERSIVERSER: Примечание: сначала я сначала ушел с конструкторов, но добавил их позже, когда у меня начал проблемы. Добавление их не было никакой разницы.

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

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

Это было полезно?

Решение

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

Другие советы

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

Вы, вероятно, можете покончить с просто расширением 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);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top