我有一些代码对于几种不同的数据类型重复完全相同。我想将其缩减为一种通用方法,但我无法弄清楚如何做到这一点。我之前发布了这个,它显示了实际代码的很大一部分: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类型的泛型函数?
答案 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; }
}
(当然,这将是抽象基类的主体 - 然后你的每个具体类都将来自它。再次,如果你真的需要单独的类型,那就是这样。)