转换索引器返回集合的内容

本文关键字:集合 返回 索引 转换 | 更新日期: 2023-09-27 18:14:19

我有一个表/行/列数据结构设置。在datatable类中有一个基于字符串的索引器来返回DtaRow,在DtaRow类中有另一个索引器来返回dtaccolumns。所以你可以这样写…

return theTables["tablename"]["rowidentifier"]["columnname"];

实际上,表中的对象不是dtarow,而是大约36个子类中的一个,比如InflationRowCurrencyRow。每个表只包含这些类型的对象,因此,例如…

茶("通胀")("一般");

总是返回一个InflationRow

现在,为了使它更容易从c#访问,我有一堆方法在更高的级别,如…

public DtaTable Inflations { get {return pTables["Inflations"];} }

现在我想解决的问题是,当有人调用这些方法之一时,他们不会得到一个InflationRow,因为datatable有dtarow。例如,

MyInfRow = Inflations["General"];

返回一个DtaRow。所以我必须一直强制转换…

MyInfRow = (InflationRow)Inflations["General"];

我想摆脱所有的演员。

到目前为止,我找到的唯一解决方案是创建36个表对象的新子类,每个子类覆盖索引器返回类型。这似乎比选角更糟糕。

有更简单的方法吗?

转换索引器返回集合的内容

如果您知道调用者只主要使用另一个索引器,则可以引入一个泛型类,提供:

public class SpecializedTable<T> 
{
    private readonly DtaTable table;
    // Just in case anyone really wants this
    public DtaTable Table { get; }
    public SpecializedTable(DtaTable table)
    {
        this.table = table;
    }
    public T this[string row] { get { return (T) (object) table[row]; } }
}

作为题外话,这些DtaTable等名称令人讨厌,难以发音/容易与。net DataTable类混淆。如果您可以重命名它们,我建议您这样做。

那么你的Inflations属性可以是:

public SpecializedTable<InflationRow> Inflations
{ 
    get
    {
        return new SpecializedTable<InflationRow>(pTables["Inflations"]);
    }
}

你可能想要缓存它,以避免每次调用该属性时都创建一个新对象。

此时,以下代码:Inflations["General"]将为您适当地执行强制转换。

使用as代替直接强制转换。如果强制转换是有效的,它将返回实例,否则它将保持为NULL。

public MyInfRow Inflations { get {return pTables["Inflations"] as MyInfRow } }