0

デフォルトの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;
        }
    }
}

このキャストが無効である理由は何ですか?単純なものを見落としているだけですか?

4

2 に答える 2

2

問題は、デフォルトの SqlMembershipProvider を使用していることです。カスタム MembershipProviderを作成する必要があります。

おそらく、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);
    }
}
于 2010-10-15T20:07:18.457 に答える
2

ベースから派生クラスにダウンキャストしようとしています (別名、動物から犬への縮小変換ですが、すべての動物が犬であるとは限りません)。変換を行う拡張メソッド ToMembershipUser を作成します。これは、変換の進め方がわかっているのに、コンパイラにはわからないためです。

于 2010-10-15T20:06:16.480 に答える