XAF学习笔记之 Upcasting

摘要:
不能够访问派生类的属性,例如,OwnedProducts属性,即使集合中包含CustomerRegistered对象。这是因为基类类型不知道OwnedProducts属性。要突破限制,请使用Upcasting功能。如果要显示属性的内容时,可以修改该集合的XPBaseCollection.DisplayableProperties属性。在这里,"Oid;CustomerName"是属性值的一部分,OwnedProducts是派生类中的属性。构建查询条件时,也可以使用相同的语法。例如,若要检索所有已购买或评估XtraGrid的客户,请使用下面的代码。
https://www.cnblogs.com/foreachlife/p/xpoupcasting.htmlXAF学习笔记之 Upcasting

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

XAF学习笔记之 Upcasting第1张

业务对象代码定义如下:

复制代码
usingDevExpress.Xpo;

public classCustomerBase : XPObject {
    stringfCustomerName;
    private stringfEmail;
    public CustomerBase(Session session) : base(session) { }

    public stringCustomerName {
        get { returnfCustomerName; }
        set { SetPropertyValue("CustomerName", reffCustomerName, value); }
    }
    public stringEmail {
        get { returnfEmail; }
        set { SetPropertyValue("Email", reffEmail, value); }
    }
}

public classCustomerRegistered : CustomerBase {
    stringfOwnedProducts;
    public CustomerRegistered(Session session) : base(session) { }
    
    public stringOwnedProducts {
        get { returnfOwnedProducts; }
        set { SetPropertyValue("OwnedProducts", reffOwnedProducts, value); }
    }
}

public classCustomerTrialed : CustomerBase {
    stringfTrialedProducts;
    public CustomerTrialed(Session session) : base(session) { }

    public stringTrialedProducts {
        get { returnfTrialedProducts; }
        set { SetPropertyValue("TrialedProducts", reffTrialedProducts, 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 classInvoice : XPObject {
    CustomerBase fCustomer;
    public Invoice(Session session) : base(session) { }

    //This is a reference type property. It can reference any CustomerBase descendant. 
    publicCustomerBase Customer {
        get { returnfCustomer; }
        set { SetPropertyValue("Customer", reffCustomer, value); }
    }
}

//Uses upcasting to access CustomerRegistered properties. 
XPCollection<Invoice> invoices = new XPCollection<Invoice>(session1,
  CriteriaOperator.Parse("Customer.<CustomerRegistered>OwnedProducts = 'XtraGrid'"));
复制代码

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


免责声明:文章转载自《XAF学习笔记之 Upcasting》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇debian环境下 l7filter 的安装教程百度地图 逆地理编码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

boost asio 异步实现tcp通讯

---恢复内容开始--- asioboost 目录(?)[-] 一前言 二实现思路 通讯包数据结构 连接对象 连接管理器 服务器端的实现 对象串行化 一、前言 boost asio可算是一个简单易用,功能又强大可跨平台的C++通讯库,效率也表现的不错,linux环境是epoll实现的,而windows环境是iocp实现的。而tcp通讯是项...

session 详细解析(转)

  转自  https://www.cnblogs.com/blueskycc/p/5524709.html?tdsourcetag=s_pcqq_aiomsg http协议是WEB服务器与客户端(浏览器)相互通信的协议,它是一种无状态协议。所谓无状态,指的是不会维护http请求数据,http请求是独立的,非持久的。而越来越复杂的WEB应用,需要保存一些用...

thinkphp中的session()方法

系统提供了Session管理和操作的完善支持,全部操作可以通过一个内置的session函数完成。 用法 session($name, $value='') 参数 name(必须):如果传入数组 则表示进行session初始化,如果传入null表示清空当前session,如果是字符串则表示session赋值、获取或者操作。 Value(可选):要设置的ses...

spring security session管理

单机 Session 管理:   本文Demo 基于 springboot 2.0.1版本.   spring security 中提供了很好的 session 配置管理。包括session 无效处理、session 并发控制、session过期等相应处理配置。   在 Security 的配置中我们重写了 protected void configure...

Android数据库相关整理

今天对Android中数据库相关的操作和代码做了一个整理,便于自己之后的查阅。主要内容有: 1.原生数据库写法 2.终端进sqlite的操作 3.第三方库 4.事务处理 5.权限和路径 一、原生数据库写法一般要先继承自SQLiteOpenHelper写一个Helper。 public class DatabaseHelper extends SQLiteO...

阿里云虚拟主机安装禅道总结

禅道是一个非常好用的项目管理系统,但他好用不好装,我用了1天才成功在虚拟主机上安装成功,其中还不断的给他改代码调试。安装成功的两个关键1是session要配置,2是演示数据有时不会自动安装(可能和mysql的版本有关,5.5.3之前的低版本的不支持utf8mb4字符)。 一、在虚拟主机上 1、删除www下的.ztaccess和.htaccess两个文件  ...