重构一个可以处理多种类型的方法

本文关键字:处理 种类 类型 方法 一个 重构 | 更新日期: 2023-09-27 18:17:26

我有以下类:

public class Disciplines
{
    public int Id { get; set; }
    public string Discipline { get; set; }
    public bool IsChecked { get; set; }
}

我的项目有几个视图模型,它们使用这个类来创建一个复选框组,其形式为:

public List<Disciplines> DisciplinesCBG { get; set; }

我将复选框选择保存到数据库中作为逗号分隔的字符串,然后在逗号上分割字符串以重新显示为复选框:

public static UserProfileViewModel DisciplinesStringToCheckboxGroup(UserProfileViewModel model)
{
    string[] disciplineArray = model.Disciplines.Split(',');
    for (int i = 0; i < model.DisciplinesCBG.Count; i++)
    {
        string currentValue = model.DisciplinesCBG[i].Discipline;
        if(Array.IndexOf(disciplineArray, currentValue) > -1)
        {
            model.DisciplinesCBG[i].IsChecked = true;
        }
    }
    return model;
}

我的问题是,我怎么能写的方法是可用于其他ViewModel类型除了UserProfileViewModel ?例如,我有一个名为RegisterViewModel的视图模型,它使用相同的public List<Disciplines> DisciplinesCBG { get; set; },我希望能够使用与上述相同的方法,而无需复制它并更改签名。我假设这是可能的?

重构一个可以处理多种类型的方法

您可以创建一个具有DisciplinesDisciplinesCBG属性的接口,然后在您想要应用的每个类中实现它。

interface IHasDiciplines
{
    string Disciplines { get; set; }
    List<Disciplines> DisciplinesCBG { get; set; }
}
class UserProfileViewModel : IHasDiciplines
{
    public string Disciplines { get; set; }
    public List<Disciplines> DisciplinesCBG { get; set; }
}
public static IHasDiciplines DisciplinesStringToCheckboxGroup(IHasDiciplines  model)
{
    string[] disciplineArray = model.Disciplines.Split(',');
    for (int i = 0; i < model.DisciplinesCBG.Count; i++)
    {
        string currentValue = model.DisciplinesCBG[i].Discipline;
        if(Array.IndexOf(disciplineArray, currentValue) > -1)
        {
            model.DisciplinesCBG[i].IsChecked = true;
        }
    }
    return model;
}