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

时间:2015-09-24 14:14:44

标签: c# .net casting type-conversion

我有一个表/行/列数据结构设置。 DtaTable类中有一个基于字符串的索引器用于返回DtaRows,另一个用于返回DtaRow类以返回DtaColumns。所以你可以写像......

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

实际上,表中的对象不是DtaRows,而是大约三十几个子类中的一个,如InflationRowCurrencyRow。每个表只包含这些类型的对象,例如......

theTables [ “膨胀图”] [ “常规”];

始终返回InflationRow

现在为了更容易从C#访问,我有一堆更高级别的方法,比如......

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

现在我想解决的问题是,当有人调用其中一种方法时,他们没有得到InflationRow,因为DtaTable有DtaRows。例如......

MyInfRow = Inflations["General"];

返回DtaRow。所以我必须一直投...

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

我想摆脱所有的演员。

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

有没有更简单的方法呢?

2 个答案:

答案 0 :(得分:1)

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

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"]将为您执行适当的演员。

答案 1 :(得分:-1)

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

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