質問

デフォルトの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);
    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top