需要帮助制作通用功能/接口(C#)

时间:2014-11-21 18:50:39

标签: c# generics interface

我有一些代码对于几种不同的数据类型重复完全相同。我想将其缩减为一种通用方法,但我无法弄清楚如何做到这一点。我之前发布了这个,它显示了实际代码的很大一部分:Exact same code repeated multiple times for different data types; Any way to make one function that can handle all possible types?

这就是我喜欢我的通用功能。我知道我没有正确写出来,但我认为这应该让我知道我的意图:

private List<LinkData> ProcessSections(<T> sections)
{
    if (sections != null)
    {
        foreach (var item in sections)
        {
            tempLD = new LinkData();
            tempLD.Text = item.SectionTitle;
            tempLD.Class = "class=\"sub-parent\"";
            autoData.Add(tempLD);

            if (item.Link != null && item.Link.Length > 0)
            {
                foreach (var child in item.Link)
                {
                    tempLD = new LinkData
                    {
                        Text = child.a.OuterXML,
                        Link = child.a.href,
                        Class = "class=\"\""
                    };
                    autoData.Add(tempLD);
                }
            }
        }
    }
    return autoData;
}

sections 有四种可能的数据类型,但所有四种都使用完全相同;特定的数据类型只取决于XML页面需要如何反序列化。这些是四种类型:MaintainedPageLeftContentAdditionalSection [],StandardPageLeftContentAdditionalSection [],StoryPageLeftContentAdditionalSection []和DoctorPageLeftContentAdditionalSection []。这里有两个例子,你可以看到它们的功能基本相同。

public partial class MaintainedPageLeftContentAdditionalSection
{

    private string sectionTitleField;

    private MaintainedPageLeftContentAdditionalSectionLink[] linkField;

    /// <remarks/>
    public string SectionTitle
    {
        get
        {
            return this.sectionTitleField;
        }
        set
        {
            this.sectionTitleField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Link")]
    public MaintainedPageLeftContentAdditionalSectionLink[] Link
    {
        get
        {
            return this.linkField;
        }
        set
        {
            this.linkField = value;
        }
    }
}


public partial class StandardPageLeftContentAdditionalSection
{

    private string sectionTitleField;

    private StandardPageLeftContentAdditionalSectionLink[] linkField;

    /// <remarks/>
    public string SectionTitle
    {
        get
        {
            return this.sectionTitleField;
        }
        set
        {
            this.sectionTitleField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("Link")]
    public StandardPageLeftContentAdditionalSectionLink[] Link
    {
        get
        {
            return this.linkField;
        }
        set
        {
            this.linkField = value;
        }
    }
}

那么,如何创建一个可以接受任何AdditionalContent类型的泛型函数?

1 个答案:

答案 0 :(得分:3)

听起来你应该有一个抽象的基类用于包含所有重复代码的部分 - 说实话,为什么你需要单独的类型并不完全清楚。然后你可以:

private List<LinkData> ProcessSections(IEnumerable<SectionBase> sections)

...并使用C#4以后的通用协方差知道List<ConcreteSection>(或其他)仍然实现IEnumerable<SectionBase>

您还应该查看自动实现的属性,这可以使您的代码更多更短,例如。

public partial class StandardPageLeftContentAdditionalSection
{
    public string SectionTitle { get; set; }

    [XmlElement("Link")]
    public StandardPageLeftContentAdditionalSectionLink[] Link { get; set; }
}

(当然,这将是抽象基类的主体 - 然后你的每个具体类都将来自它。再次,如果你真的需要单独的类型,那就是这样。)