MembershipUser から継承するカスタム CustomMembershipUser があります。
public class ConfigMembershipUser : MembershipUser
{
// custom stuff
}
Linq-to-SQL を使用してデータベースから読み取り、User エンティティを取得しています。この関数を MembershipUser として作成するために、明示的な変換を定義しました。
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);
}
このキャストはうまくいきます:
MembershipUser memUser = (MembershipUser) entityUser;
ただし、CustomMembershipUser への 2 番目のキャストは失敗します。
MembershipUser memUser = (MembershipUser) entityUser;
CustomMembershipUser custUser = (CustomMembershipUser) memUser;
キャストを変更すると
CustomMembershipUser custUser = memUser;
暗黙のキャストが機能しないが、明示的なキャストが存在するというインテリセンス エラーが表示されます。
... それに加えて、基本クラスからサブクラスへのキャストを定義できないようです。私はそれを試しましたが、失敗しました。私が最も理解していないのは、なぜ基本クラスからサブクラスへのキャストが失敗するのかということです。定義上、サブクラスには基本クラスのすべてのプロパティがあるため、何が問題なのですか。
編集
MembershipUser から CustomMembershipUser への明示的なキャストを定義しようとしました (最初にキャスト用のプライベート コンストラクターを定義しました)。
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
}
次に、カスタム キャストを定義しました。
public static explicit operator CustomMembershipUser(MembershipUser user)
{
return new CustomMembershipUser(user);
}
次のエラーが発生しました。
'CustomMembershipUser.explicit operator CustomMembershipUser (System.Web.Security.MembershipUser)':基本クラスとの間のユーザー定義の変換は許可されていません。
それで...基本クラスからサブクラスにキャストできませんか?