zoukankan      html  css  js  c++  java
  • XAF学习笔记之 Upcasting

    通常,我们会定义继承层次结构,假设有类型,CustomerBase,CustomerTrialed,CustomerRegistered三个类型,并且继承结构如下:

    业务对象代码定义如下:

    using DevExpress.Xpo;
    
    public class CustomerBase : XPObject {
        string fCustomerName;
        private string fEmail;
        public CustomerBase(Session session) : base(session) { }
    
        public string CustomerName {
            get { return fCustomerName; }
            set { SetPropertyValue("CustomerName", ref fCustomerName, value); }
        }
        public string Email {
            get { return fEmail; }
            set { SetPropertyValue("Email", ref fEmail, value); }
        }
    }
    
    public class CustomerRegistered : CustomerBase {
        string fOwnedProducts;
        public CustomerRegistered(Session session) : base(session) { }
        
        public string OwnedProducts {
            get { return fOwnedProducts; }
            set { SetPropertyValue("OwnedProducts", ref fOwnedProducts, value); }
        }
    }
    
    public class CustomerTrialed : CustomerBase {
        string fTrialedProducts;
        public CustomerTrialed(Session session) : base(session) { }
    
        public string TrialedProducts {
            get { return fTrialedProducts; }
            set { SetPropertyValue("TrialedProducts", ref fTrialedProducts, value); }
        }
    }

    我们可以使用如下代码进行查询所有客户的数据。

    XPCollection<CustomerBase> allCustomers = new XPCollection<CustomerBase>(session1);
    这个集合类型CustomerBase,所以只能访问CustomerBase类型属性能够访问派生类的属性例如OwnedProducts 属性,即使集合包含 CustomerRegistered 对象因为基类类型知道 OwnedProducts 属性

    要突破限制使用Upcasting功能

    如果要显示属性的内容时,可以修改集合的 XPBaseCollection.DisplayableProperties 属性。设置这样:"Oid;CustomerName<CustomerRegistered>OwnedProducts"。

    在这里"Oid;CustomerName"属性一部分,<CustomerRegistered>OwnedProducts 是派生类中的属性

    构建查询条件可以使用相同语法例如若要检索所有购买评估 XtraGrid 客户使用下面代码
    XPCollection<CustomerBase> gridCustomers = new XPCollection<CustomerBase>(session1, 
    CriteriaOperator.Parse(
    "<CustomerRegistered>OwnedProducts = 'XtraGrid' or <CustomerTrialed>TrialedProducts = 'XtraGrid'" 
     ));

    使用以下语法引用类型属性的查询

    public class Invoice : XPObject {
        CustomerBase fCustomer;
        public Invoice(Session session) : base(session) { }
    
        // This is a reference type property. It can reference any CustomerBase descendant. 
        public CustomerBase Customer {
            get { return fCustomer; }
            set { SetPropertyValue("Customer", ref fCustomer, value); }
        }
    }
    
    // Uses upcasting to access CustomerRegistered properties. 
    XPCollection<Invoice> invoices = new XPCollection<Invoice>(session1,
      CriteriaOperator.Parse("Customer.<CustomerRegistered>OwnedProducts = 'XtraGrid'"));

     可以看出来,只要是派生类中的属性,就可以用<派生类型>进行转换,后接属性名称即可。

  • 相关阅读:
    [置顶] Ubuntu 12.04以上如何恢复GNOME传统界面
    Cstyle的UEFI导读之SEC第一篇 Reset Vector
    二叉排序树的实现
    【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
    java中的代理
    eclipse连接远程hadoop集群开发时0700问题解决方案
    eclipse连接远程hadoop集群开发时权限不足问题解决方案
    垂死或涅槃重生 -- Delphi XE5 我们将宣布感情的回归
    百度地图 Android SDK
    MySQL第五个学习笔记 该数据表的操作
  • 原文地址:https://www.cnblogs.com/foreachlife/p/xpoupcasting.html
Copyright © 2011-2022 走看看