【发布时间】:2010-03-12 10:27:47
【问题描述】:
更新:我应该在原帖中提到我想在这里了解更多关于泛型的信息。我知道这可以通过修改基类或创建两个文档类都实现的接口来完成。但是为了这个练习,我只对不需要对文档类或其基类进行任何修改的解决方案真正感兴趣。我认为问题涉及扩展方法这一事实暗示了这一点。
我已经编写了两个几乎相同的通用扩展方法,并试图弄清楚如何将它们重构为一个方法。它们的区别仅在于一个在 List 上运行,另一个在 List 上运行,我感兴趣的属性是 AssetID 的 AssetDocument 和 PersonID 的 PersonDocument。尽管 AssetDocument 和 PersonDocument 具有相同的基类,但属性是在每个类中定义的,所以我认为这没有帮助。我试过了
public static string ToCSVList<T>(this T list) where T : List<PersonDocument>, List<AssetDocument>
我想我也许可以测试类型并采取相应的行动,但这会导致语法错误
类型参数“T”继承 冲突的约束
这些是我想重构为单个方法的方法,但也许我只是太过分了,最好将它们保持原样。我想听听你的想法。
public static string ToCSVList<T>(this T list) where T : List<AssetDocument>
{
var sb = new StringBuilder(list.Count * 36 + list.Count);
string delimiter = String.Empty;
foreach (var document in list)
{
sb.Append(delimiter + document.AssetID.ToString());
delimiter = ",";
}
return sb.ToString();
}
public static string ToCSVList<T>(this T list) where T : List<PersonDocument>
{
var sb = new StringBuilder(list.Count * 36 + list.Count);
string delimiter = String.Empty;
foreach (var document in list)
{
sb.Append(delimiter + document.PersonID.ToString());
delimiter = ",";
}
return sb.ToString();
}
【问题讨论】:
-
AssetDocument 和 PersonDocument 是否派生自一个公共基类/接口?
标签: c# generics refactoring