デフォルトのSqlMembershipProviderを使用していますが、「DisplayName」プロパティが必要だったため、カスタムMembershipUserクラス(SoeMembershipUser)を作成しました。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;
}
}
}
このキャストが無効である理由は何ですか?単純なものを見落としているだけですか?