カスタムクラスにメンバーシップユーザーをキャストできません(ASP.NET)
-
08-10-2019 - |
質問
デフォルトのsqlmembershipproviderを使用していますが、「displayName」プロパティが必要だったため、Custom MembershipUserクラス(SoeMemberShipUser)を作成しました。 DisplayNameが行うのは、ユーザー名を見て、異なる方法でフォーマットすることです。
soemembershipuserユーザーにmembershipuserをキャストしようとすると、nivalidcastexceptionが表示されます。正確なエラーは、「タイプ '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;
}
}
}
このキャストが無効な理由は何ですか?私はただシンプルなものを見落としていますか?
解決
あなたは基地から派生クラスへのダウンキャストを試みています(別名、動物から犬へのように、狭く転換する回心 - しかし、すべての動物が犬ではありません)。拡張メソッド、tomembershipuserを作成します。これは、どのように進行する必要があり、コンパイラがいないかを知っているため、変換を行います。
他のヒント
問題は、デフォルトのsqlmembershipproviderを使用していることです。あなたはaを作成する必要があります カスタムメンバーシップロバイダー.
おそらく、GetuserメソッドのSQLMemberShipproviderを拡張するだけで取得できます。
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);
}
}