我有一个 Table 类,它从其基类 DbTableBase 继承一个属性,并MegaList<DbColumnBase> Columns
使用更具体的属性隐藏基类属性MegaList<TableColumn> Columns
。
最初我的应用程序仅针对 Oracle,但最近重构为一个公共基础,因此我可以添加 SQLServer 和其他目标导致 Velocity 模板失败。我的 NVelocity 模板模块在任何具有被派生隐藏的基本实现的集合上都失败,因为它评估基本属性。
context.Put("table", table); // table is Table, not TableBase
...
#foreach ($c in $table.Columns)
$c.Name
#end
我的容器声明是:
public class MegaList<T> : ObservableCollection<T>
{
public MegaList() {}
// etc. etc.
}
我的表类型有一个 _columns 字段,当作为 MegaList 公开时,NVelocity 无法迭代叶子 Table.Columns 列表:
public class Table : TableBase {
MegaList<ColumnBase> _columns = new MegaList<ColumnBase>();
public MegaList<ColumnBase> Columns // template takes this one, even though it is hidden
{
get { return _columns; }
}
}
public class Table : TableBase {
new public MegaList<TableColumn> Columns // Velocity ignores this, chooses base Columns
{
get { return _columns.DownCast<TableColumn>(); }
set { _columns = value.UpCast<DbTableColumn, TableColumn>(); }
}
public MegaList<TableColumn> Columns2 // Velocity sees this
{
get { return _columns; }
}
}
NVelocity 正在评估基础 TableBase.Columns,但如果我的模板引用 $table.Columns2,NVelocity 会评估 Table.Columns2。
我不能使属性虚拟,因为类型不同,尽管更具体 大声思考,我认为这种行为是因为 VelocityContext 持有“对象”引用,并且在选择正确属性的情况下存在某种问题倍数,尽管我认为它应该选择叶子属性。