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

相关问题