0

我使用的是默認的SqlMembershipProvider,但我創建了一個自定義的MembershipUser類(SoeMembershipUser),因爲我需要一個「DisplayName」屬性。所有DisplayName都會查看UserName並以不同的格式進行格式化。無法將MembershipUser投射到自定義類(ASP.NET)

當我嘗試將一個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; 
     } 
    } 
} 

任何想法爲何此演員表無效?我只是俯視簡單的東西?

+0

你能發佈實際無效的轉換錯誤信息嗎? – 2010-10-15 20:02:45

+0

我在上面添加了確切的錯誤消息。堆棧跟蹤沒有顯示任何異常情況。 – Rick 2010-10-15 20:08:58

回答

2

你正在試圖從一個基地downcast派生類(又名縮小轉換,如從動物到狗 - 但不是每個動物都是狗)。創建一個擴展方法ToMembershipUser,它將執行轉換,因爲您知道它應該如何繼續,而編譯器不會。

+0

作爲擴展方法的替代方法,您可以使用C#的「顯式」關鍵字,如下所示:http://msdn.microsoft.com/zh-cn/library/xhbhezf4(v=VS.100).aspx – Antony 2010-10-15 20:25:44

+0

關於「顯式」:好像我需要將顯式運算符添加到MembershipUser類本身,因爲它對我的情況很有用(除非我正在閱讀文檔錯誤)。 – Rick 2010-10-15 20:56:30

+0

是的,你是對的 - 顯式操作符在這種情況下不起作用。我的錯。只需使用獨立功能或擴展方法即可。任何一個人都應該工作。 – Antony 2010-10-15 21:06:41

2

問題是您正在使用默認的SqlMembershipProvider。你將不得不創建一個custom 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); 
    } 
} 
+0

+1 - 兩者非常齊頭並進:) – 2010-10-15 20:25:47

+0

+1我同意這可能會解決我的問題,但它不像我希望的那樣可擴展,因爲我希望能夠將會員提供商交換爲現有系統。由於.NET不允許多重繼承,即使我從MembershipProvider而不是SqlMembershipProvider繼承,這也會導致問題。 – Rick 2010-10-15 21:09:54

+0

@瑞克我看到你接受了另一個答案,所以我假設你有一個計劃。祝你好運。 – bendewey 2010-10-15 21:14:12

相關問題