c# - 如何将这两种相似的方法重构为一个?

标签 c# generics refactoring

我看过一些使用“T”使方法可重用于不同类的泛型集合的示例,但我从未真正深入了解或理解这些示例。

我想知道是否可以将下面的 2 种方法合二为一,这样做的缺点是什么(性能方面)。

有人吗?

        [NonAction]
        public List<SelectListItem> ToSelectList(IEnumerable<Department> departments, string defaultOption)
        {
            var items = departments.Select(d => new SelectListItem() { Text = d.Code + " - " + d.Description, Value = d.Id.ToString() }).ToList();
            items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
            return items;
        }

        [NonAction]
        public List<SelectListItem> ToSelectList(IEnumerable<Function> functions, string defaultOption)
        {
            var items = functions.Select(f => new SelectListItem() { Text = f.Description, Value = f.Id.ToString() }).ToList();
            items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
            return items;
        }

解决方案

我使用的解决方案:

用法

var departmentItems = departments.ToSelectList(d => d.Code + " - " + d.Description, d => d.Id.ToString(), " - ");
var functionItems = customerFunctions.ToSelectList(f => f.Description, f => f.Id.ToString(), " - ");

 public static class MCVExtentions
    {
        public static List<SelectListItem> ToSelectList<T>(this IEnumerable<T> enumerable, Func<T, string> text, Func<T, string> value, string defaultOption)
        {
            var items = enumerable.Select(f => new SelectListItem() { Text = text(f), Value = value(f) }).ToList();
            items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
            return items;
        }
    }

最佳答案

老派的方法是为部门和职能部门创建一个通用接口(interface):

interface A
{
int ID{get;}
string Description{get;}
}

您在 Department 上实现 Description 以返回 d.Code + "- "+ d.Description。 并编写函数以使用此接口(interface)而不是具体类:

[NonAction]
    public List<SelectListItem> ToSelectList(IEnumerable<A> as, string defaultOption)
    {
        var items = as.Select(a => new SelectListItem() { Text = a.Description, Value = a.Id.ToString() }).ToList();
        items.Insert(0, new SelectListItem() { Text = defaultOption, Value = "-1" });
        return items;
    }

编辑:关于使用泛型,在这种情况下不会有太大帮助,因为

  • 您传递的对象需要实现 Id 和 Description
  • 你不会返回这些对象,所以在这方面你不必关心泛型的类型安全

关于c# - 如何将这两种相似的方法重构为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/828624/

相关文章:

c# - 防止表单多次显示

java - 跨数据类型重构相似代码

java - 重构模式匹配序列

c# - 什么是 C# 中的 "fieldof()"方法

c# - 有人能解释一下DispatcherObject的底层原理吗?基于执行线程存储什么状态?

c# - 如何在 C# 中存储类列表?

java - ListFragment 适配器的通用 View 持有者类型

javascript - 使用 jQuery 批量更改 HTML 内容

python - 如何用循环缩短这个网格移动逻辑(python)

c# - 如何在 C# 中处理枚举 0(CA1008 讨论)