Невозможно преобразовать 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);
}
}