我写了个派生类 public class MyMemberShipUser:MembershipUser
现在用MemberShip.GetUser(userName)得到了一个MemberShipUser
如果把这个基类实例MemberShipUser转换为派生类实例myMemberShipUser呢

解决方案 »

  1.   

    myMemberShipUser u = MemberShip.GetUser(userName) as myMemberShipUser ;
    if(u != null)
    {
    }
    也许用接口好些,免得转
      

  2.   

    (MyMemberShipUser)MemberShip.GetUser(userName)强制转换嘛,就是声明一下类型就好了。使用“as”,总是需要判断类型,然后进行各种类型转换,比强制转换多做很多工作。如果你明知强制装换就好了,就不要做类型转换运算操作。
      

  3.   

    huigll(会) :我用这样的方法试过了,MemberShip.GetUser(userName)可以得到MemberShipUser,可是操作后u确实null,编译器也没有报错另外你说的用接口,能说得详细点吗?
      

  4.   

    (MyMemberShipUser)MemberShip.GetUser(userName)这样会报错,无法转换
      

  5.   

    如果MemberShip.GetUser(userName)中创建的是父类型并返回,那么是不能转化成子类型的。
    不知道你要实现什么,贴出部分代码看看
      

  6.   

    派生类的信息肯定比基类多,因此创建的基类对象是不能转换为派生类的。
    比如:A是基类,B派生自A,比A多了个属性x。
    A a = new A();
    B b = (B)a;是不允许的,因为不知道x应该怎样取值。而:
    A a = new B();
    B b = (B)a;是允许的。
      

  7.   

    前提是你自己是否真的明知其类型。如果你口头说一定返回MyMemberShipUser或者其子类的对象,但是做起来根本不是这么回事,那么责任如何承担呢?要承担责任,可以写:  MemberShipUser ret=MemberShip.GetUser(userName);
      if(ret is MyMemberShipUser)
      {
        .......
      }
      else
      {
          //逻辑处理
      }
    实际上,这完全是设计错误,理应从class MyMemberShipUser设计上就杜绝,即有断言或者回归测试来保证。所以我说“如果你明知强制装换就好”,这要看你的程序是个什么质量的,我写的程序 (MyMemberShipUser)MemberShip.GetUser(userName) 不会出错,你写的就可以先用is判断一下。
      

  8.   

    我在网上查了半天,找到几篇文章也说这样的确不行
    本来想用这种方法扩展一下MembershipUser的,看来行不通了
      

  9.   

    如果你采用别人写的class MyMemberShipUser,那么“这样会报错,无法转换”这就对了,理应向外部继续抛出异常。你是按照MyMemberShipUser这个协议来设计的,别人破坏了协议,你能怎么办呢?难道是自己给更正吗?不可能。只能向上汇报异常。
      

  10.   

    可能我的设想本身就是不可实现的:  public class MyMemberShipUser:MembershipUser
      {
              private string _qq;
         ……
              Public String QQ
              {
                   get;
                   set;
               }
          ……
      }用的时候:
        public class MyMemberShip
        {
            public static MyMemberShipUser GetUser(string userName)
            {
                MyMemberShipUser myUser = (MyMemberShipUser)Membership.GetUser(userName);
                return myUser;
            }
        }
      

  11.   

    用的时候:
        public class MyMemberShip
        {
            public static MyMemberShipUser GetUser(string userName)
            {
                MyMemberShipUser myUser = (MyMemberShipUser)Membership.GetUser(userName);      myUser.QQ=GetQQ();            return myUser;
            }
        }
      

  12.   

    哦,我开头看的太快,我们理解有点出入。你应当首先注册自己的membershipProvider,那么CreateUser(....)返回的是你自己的那种user,你就可以强制类型转换了。
      

  13.   

    使用纯粹的 OO 概念很难理解那些微软项目中某些比较烂的设计。我估计 Membership、MembershipUser 大概是项目组里某个喜欢设计模式而并不喜欢纯粹OO的讨厌的小程序员设计的,像memberShipProvider这类繁琐的控制器类的东西只有设计模式那种故意把简单的事情搞得又臭又长的代码最喜欢在自然的应用概念旁边放好几个设计模式特有的计算机领域概念。不仅微软项目,很多所谓的大公司的项目组里总是有很多小程序员(绝对不是OO设计师水平)喜欢给类型命名 xxxxxProvider、xxxxxControler、xxxxxManager、xxxxxHelper。这是一个经验,如果这种命名很多,这样的项目组里活活能把人累死。
      

  14.   

    sp1234,谢谢你帮我指了一个方向,回头我在网上查一下自定义memberShipProvider的方法。