Вы не можете.Readonly
означает, что вы не можете установить его, вы можете только прочитать его значение.
Единственный способ получить правильно заполненный MembershipUser
, который вы можете обновить, - через Membership.GetUser
, который вернетсяэкземпляр класса MembershipUser
по умолчанию, а не экземпляр вашего пользовательского класса.Чтобы сделать то, что вы пытаетесь сделать, вам нужно создать пользовательский MembershipProvider
, который возвращает Customer
вместо MemberhipUser
, но это, вероятно, больше проблем, чем оно того стоит.То, что я нашел, работает намного лучше - это сделать Customer
"обтекание" MembershipUser
вместо его расширения.Я сделал это обоими способами (создание собственного MembershipProvider
и создание обертки вокруг MembershipUser
), и использование обертки определенно является более простым подходом:
public class Customer : MembershipUser
{
#region Properties
private MembershipUser _user;
....
#region Load
public static Customer Load(IDataReader iDataReader)
{
Customer oCustomer = new Customer();
...
if(!string.IsNullOrEmpty(oCustomer.UserIdAspNet))
{
oCustomer._user = Membership.GetUser(Guid.Parse(oCustomer.UserIdAspNet));
}
return oCustomer;
}
}
Тогда вместо того, чтобы скрывать свойства только для чтения, на самом деле сделать что-то с ними.Изменение Customer.IsLockedOut с true
на false
означает, что что-то должно произойти, поэтому в вашем свойстве Customer.IsLockedOut
вместо простого хранения значения, которое ничего не значит, вызовите MembershipUser.UnlockUser()
:
public bool IsLockedOut
{
get
{
return _user.IsLockedOut;
}
set
{
if(value != _user.IsLockedOut)
{
if(value)
{
// There's no way to programatically lock out a user, so either throw an InvalidOperationException or ignore it
}
else
{
_user.UnlockUser();
}
}
}
}
Если вы не хотите, чтобы это выполнялось при установке свойства, вам нужно будет отследить, изменилось ли значение, и вызвать UnlockUser()
из вашего CustomerManager.UpdateCustomer
метода.