c# - 如何重构这些泛型方法?

标签 c# generics refactoring

更新:我应该在原帖中提到我想在这里了解更多关于泛型的知识。我知道这可以通过修改基类或创建两个文档类都实现的接口(interface)来完成。但是为了这个练习,我只对不需要对文档类或其基类进行任何修改的解决方案感兴趣。我认为问题涉及扩展方法这一事实暗示了这一点。

我已经编写了两个几乎相同的通用扩展方法,并且正在尝试弄清楚如何将它们重构为一个方法。它们的区别仅在于一个对 List 进行操作,另一个对 List 进行操作,我感兴趣的属性是 AssetDocument 的 AssetID 和 PersonDocument 的 PersonID。尽管 AssetDocument 和 PersonDocument 具有相同的基类,但每个类中都定义了属性,所以我认为这没有帮助。我试过了

public static string ToCSVList<T>(this T list) where T : List<PersonDocument>, List<AssetDocument>

我想我也许可以测试类型并采取相应的行动,但这会导致语法错误

Type parameter 'T' inherits conflicting constraints

这些是我想重构为一个方法的方法,但也许我只是太过分了,最好让它们保持原样。我想听听你的想法。

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

最佳答案

您的实现基本上是重新实现 string.Join 方法,因此您可以尝试使用一些 LINQ 使其更简单和更通用:

public static string ToCSVList<T>(this IEnumerable<T> collection)
{ return string.Join(",", collection.Select(x => x.ToString()).ToArray()); }

public static string ToCSVList(this IEnumerable<AssetDocument> assets)
{ return assets.Select(a => a.AssetID).ToCSVList(); }

public static string ToCSVList(this IEnumerable<PersonDocument> persons)
{ return persons.Select(p => p.PersonID).ToCSVList(); }

关于c# - 如何重构这些泛型方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2431987/

相关文章:

c# - 通用接口(interface)列表

c# - 这个API可以改进吗?

c# - 在 ASP.NET Core 2 中的 webhost 之前开始记录

javascript - Bootstrap 警报自动隐藏不起作用

c# - 条件 xml 序列化

c# - 如何从 SSIS 脚本任务将值传递给 Web 服务?

c# - 确定类 x 是否派生自类 y 的最简单方法? (C#)

generics - Rust 中相互依赖的通用特征

使用 lua 的 C++ 工厂

java - 将 "throw new exception"提取到方法中会导致编译错误