2007年1月10日所有随笔

CommunityServer 2.1 的 CSCopy 类

  此类支持序列化,此类的主要动作是根据子类的默认构造函数创建一个子类实例,objects 字段是 Hashtable 类型,存放一个键值对,它的键的类型是 Type 类型,值类型是 ConstructorInfo 类型,也就是它存放的是代表子类的构造函数的类型,作用是利用此构造函数类实例 Invoke 出子类的一个实例。

  CSCopy 类还有一个虚拟的成员函数 Copy(),一般地,子类继承时重写此类,然后在子类的 Copy() 函数里调用基类的 CreateNewInstance() 函数(或用 base.Copy())创建对象后,将子类中各成员变量的值赋给新创建的实例。如:

    public override object Copy()
    {
        Thread thread = base.Copy() as Thread;  // 调用 Thread 类的默认构造函数创建的实例

        // 以下的赋值是将当前对象(看到都用 this 了吧)的各成员变量的值赋给新对象,
        // 也就等于 Copy 一个副本,呵呵,从类名都可以看出来
        thread.MostRecentPostAuthor = this.MostRecentPostAuthor;
        thread.MostRecentPostAuthorID = this.MostRecentPostAuthorID;
        thread.AuthorID = this.AuthorID;
        thread.Status = this.Status;
        thread.IsSticky = this.IsSticky;
        thread.StickyDate = this.StickyDate;
        thread.MostRecentPostID = this.MostRecentPostID;

        return thread;
    }

    继承此类的子类一般是需要将对象 Copy 一份,然后另作它用。如:

    public virtual String RenderedBody(PostTarget target)
    {
        Post p = this.Copy() as Post;

        if (p.Section != null)
            CSEvents.PreRenderPost(p,p.Section.ApplicationType,target);
        else
            CSEvents.PreRenderPost(p,ApplicationType.Unknown,target);

        return p.FormattedBody;
    }