如何编写可重用函数来解析XML并返回一个可以被重写的对象的ArrayList来返回一个子类的ArrayList

时间:2014-05-15 05:04:33

标签: c# xml oop design-patterns

我正在编写一个带有函数的可重用实用程序类,该函数将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,那将非常麻烦。

1 个答案:

答案 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();
    }
}