我有3个课程:“ChemDataChemicals (超级)”,“ ChemDataAlcohol (Sub),” ChemDataAcidBase “(Sub)和common List(类型:ChemDataChemicals)包含所有对象。我的superClass包含我的大多数字段,但子类都包含一个额外的字段--pH(十进制)和VolPercentage(十进制)。
下面的代码应该在ListBox中添加item.Name和item.VolPercentage / item.pH,但我无法访问子类中的my字段。
foreach (ChemDataChemicals item in tmpChemDataChemicalsList)
{
if (item is ChemDataAlcohol)
{
listBox1.Items.Add(String.Format("{0}: {1}%", item.Name, (ChemDataAlcohol)item.VolPercentage));
}
else if (item is ChemDataAcidBase)
{
listBox1.Items.Add(String.Format("{0}: {1}M", item.Name, item.pH));
}
}
我尝试了一些铸造,但似乎没有任何效果。 (Windows窗体 - C#) 谢谢,
答案 0 :(得分:2)
更改
(ChemDataAlcohol)item.VolPercentage
到
((ChemDataAlcohol)item).VolPercentage
另外,我建议您使用as
关键字:
(item as ChemDataAlcohol).VolPercentage
因为使用第一种方法,如果转换失败,则抛出异常。使用as
方法,结果为null,可以检查,避免抛出异常。
答案 1 :(得分:0)
如果你有一个更普遍的问题,还有另一种方法可以从列表中访问一个子类的项目,那就是使用OfType< T>任何集合的扩展方法。
private class Chemical
{
public string formula;
}
private class ChemDataAlcohol : Chemical
{
public string Name;
}
private class ChemDataAcidBase : Chemical
{
public decimal pH; // at 1.0 M
}
public static void Test()
{
Chemical[] chemicals = {
new Chemical { formula = "H2O" },
new ChemDataAcidBase { formula = "H2SO4", pH = 0 },
new ChemDataAlcohol { formula = "C2H6O", Name="ethanol" },
new Chemical { formula = "CO2" },
new ChemDataAcidBase { formula = "CH3COOH", pH = 2.4M },
};
List<ChemDataAlcohol> alcohols = chemicals.OfType<ChemDataAlcohol>().ToList();
foreach (ChemDataAlcohol alcohol in alcohols) { string name = alcohol.Name; }
List<ChemDataAcidBase> acids = chemicals.OfType<ChemDataAcidBase>().ToList();
foreach (ChemDataAcidBase acid in acids) { decimal pH = acid.pH; }
}
缺点:它并不适用于所有情况,并且需要进行一定程度的调整以满足您的问题。