我有一个表/行/列数据结构设置。 DtaTable类中有一个基于字符串的索引器用于返回DtaRows,另一个用于返回DtaRow类以返回DtaColumns。所以你可以写像......
return theTables["tablename"]["rowidentifier"]["columnname"];
实际上,表中的对象不是DtaRows,而是大约三十几个子类中的一个,如InflationRow
和CurrencyRow
。每个表只包含这些类型的对象,例如......
theTables [ “膨胀图”] [ “常规”];
始终返回InflationRow
。
现在为了更容易从C#访问,我有一堆更高级别的方法,比如......
public DtaTable Inflations { get {return pTables["Inflations"];} }
现在我想解决的问题是,当有人调用其中一种方法时,他们没有得到InflationRow,因为DtaTable有DtaRows。例如......
MyInfRow = Inflations["General"];
返回DtaRow。所以我必须一直投...
MyInfRow = (InflationRow)Inflations["General"];
我想摆脱所有的演员。
到目前为止,我找到的唯一解决方案是创建36个新的表对象子类,每个子类重写索引器返回类型。这似乎比铸造更糟糕。
有没有更简单的方法呢?
答案 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 } }