转换索引器返回集合的内容
本文关键字:集合 返回 索引 转换 | 更新日期: 2023-09-27 18:14:19
我有一个表/行/列数据结构设置。在datatable类中有一个基于字符串的索引器来返回DtaRow,在DtaRow类中有另一个索引器来返回dtaccolumns。所以你可以这样写…
return theTables["tablename"]["rowidentifier"]["columnname"];
实际上,表中的对象不是dtarow,而是大约36个子类中的一个,比如InflationRow
和CurrencyRow
。每个表只包含这些类型的对象,因此,例如…
茶("通胀")("一般");
总是返回一个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 } }