I have a custom CustomMembershipUser that inherits from MembershipUser.
public class ConfigMembershipUser : MembershipUser
{
// custom stuff
}
I am using Linq-to-SQL to read from a database and get a User entity; to make this function as a MembershipUser I have defined an explicit conversion:
public static explicit operator MembershipUser(User user)
{
DateTime now = DateTime.Now;
if (user == null) return null;
return new MembershipUser("MagicMembershipProvider",
user.DisplayName, user.Id,
user.Email, "", "", true, false,
now, now, now, now, now);
}
This cast works fine:
MembershipUser memUser = (MembershipUser) entityUser;
However, the second cast to CustomMembershipUser fails:
MembershipUser memUser = (MembershipUser) entityUser;
CustomMembershipUser custUser = (CustomMembershipUser) memUser;
If I change the cast to
CustomMembershipUser custUser = memUser;
I get an intellisense error telling me an implicit cast won't work but an explicit cast exists.
... and to top it all off, I can't apparently define a cast from a base class to a subclass. I tried it and it failed. The thing I don't understand most of all is why would a cast from a base class to a subclass ever fail? By definition the subclass has all of the properties of the base class, so what's the problem.
EDIT
I tried to define an explicit cast from MembershipUser to CustomMembershipUser (first I defined a private constructor for the cast):
private ConfigMembershipUser(MembershipUser user)
: base(user.ProviderName, user.UserName, user.ProviderUserKey, user.Email,
user.PasswordQuestion, user.Comment, user.IsApproved, user.IsLockedOut,
user.CreationDate, user.LastLoginDate, user.LastActivityDate,
user.LastPasswordChangedDate, user.LastLockoutDate)
{
// initialize extended CustomMembershipUser stuff here
}
Then I defined my custom cast:
public static explicit operator CustomMembershipUser(MembershipUser user)
{
return new CustomMembershipUser(user);
}
and I got the following error:
'CustomMembershipUser.explicit operator CustomMembershipUser (System.Web.Security.MembershipUser)': user-defined conversions to or from a base class are not allowed.
So... I can't cast from a base class to a subclass?