我正在编写一个带有函数的可重用实用程序类,该函数将XML请求字符串作为参数,它应该解析XML响应并返回CompanyData对象的ArrayList。
public ArrayList ReadCompaniesData(string xmlRequest)
该函数将XML请求发送到Accounting应用程序公开的Web服务,该应用程序将返回有关该应用程序托管的多个公司的一些信息。
我可以创建一个名为CompanyData的对象,其中包含公司标准属性的成员。但有时,会计应用程序可以定制为包含公司的其他属性。
在这种情况下,我将创建CompanyData的子类,例如:MyCompanyData,我将需要覆盖Utility类的子类中的ReadCompaniesData方法。该子类方法如何为公司的所有公共/标准属性调用基类方法,然后解析特定附加属性的XML响应?
问题是基类方法将返回CompanyData对象的ArrayList,而子类将需要返回MyCompanyData对象(子类)的ArrayList。我不想在子类方法中复制整个代码;只是用于解析自定义公司的其他属性的附加代码。
从基类方法,我可以将原始XML响应作为附加的out参数返回,以便子类可以解析其他标记,但是如何将ArrayList中的对象类型从CompanyData更改为MyCompanyData?如果它需要创建一个新对象并按字段从CompanyData复制到MyCompanyData,那将非常麻烦。
答案 0 :(得分:0)
如果只需要枚举返回的集合,可以尝试将方法的返回类型更改为IEnumerable<T>
,它支持通用协方差,并且可以使用扩展方法转换为列表或过滤所需类型(ToList,Cast, OfType等),
将解析逻辑移动到域类,并在Util类的模板化方法中实例化实际类型。
像这样的东西(我使用System.Xml.Linq中的类而不是原始文本):
class Company
{
public string Title { get; set; }
public virtual void ParseXml(XElement elem)
{
this.Title = elem.Element("Title").Value;
}
}
class DerivedCompany : Company
{
public string Address { get; set; }
public override void ParseXml(XElement elem)
{
base.ParseXml(elem);
this.Address = elem.Element("Address").Value;
}
}
class CompanyUtil
{
protected virtual Company GenerateRealCompany()
{
return new Company();
}
public IEnumerable<Company> ReadCompanies(XDocument document)
{
IList<Company> companies=new List<Company>();
foreach (var elem in document.Root.Elements())
{
var comp = GenerateRealCompany();
comp.ParseXml(elem);
companies.Add(comp);
}
return companies;
}
}
class DerivedCompanyUtil:CompanyUtil
{
protected override Company GenerateRealCompany()
{
return new DerivedCompany();
}
}