0

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

Когда я пытаюсь использовать членский член для пользователя 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; 
     } 
    } 
} 

Подумайте, почему данный аттестат не действителен? Я просто пропустил что-то простое?

+0

Можете ли вы разместить сообщение об ошибке при неправильном литье? –

+0

Я добавил сообщение об ошибке выше. Трассировка стека не показывает ничего необычного. – Rick

ответ

2

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

+0

В качестве альтернативы методу расширения вы можете использовать ключевое слово C# «Явное», как показано здесь: http://msdn.microsoft.com/en-us/library/xhbhezf4(v=VS.100).aspx – Antony

+0

Что касается «явного»: кажется, мне нужно добавить явный оператор в класс MembershipUser, чтобы он был полезен в моей ситуации (если только я не читаю документацию неправильно). – Rick

+0

Да, вы правы - явный оператор не работал бы в этом случае. Виноват. Просто зайдите с автономной функцией или методом расширения. Любой должен работать. – Antony

2

Проблема в том, что вы используете SqlMembershipProvider по умолчанию. Вам нужно будет создать custom 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); 
    } 
} 
+0

+1 - два идут очень много рука об руку :) –

+0

+1 Я согласен, что это, скорее всего, решит мою проблему, но это не так широко, как хотелось бы, так как я хочу быть в состоянии поменять участников и поставщиков членства для существующих систем. Так как .NET не допускает множественного наследования, это может вызвать проблему, даже если я унаследовал от MembershipProvider, а не SqlMembershipProvider. – Rick

+0

@Rick Я вижу, что вы приняли другой ответ, поэтому я предполагаю, что у вас есть план. Удачи. – bendewey