使用多个数据模型,帮助程序和减少代码重复 - C#

时间:2018-03-27 06:53:38

标签: c# .net web-services helper .net-core-2.0

我使用.Net Core 2.0为Web服务构建模型和帮助程序类。我需要通过传入模型及其对象列表,对许多模型进行一些重复性的工作。截至目前,我已经在每个辅助类中完全定义了该方法,因为每个类都传递其各自的模型及其对象列表。返回类型也是同一模型的对象列表。

无论如何都可以使用单一方法简单地使用这种方法,但是在每个帮助程序类中我都会传入并获取不同的数据模型及其列表以及其他一些参数,这些参数对于所有帮助类。

我将用一个简单的例子来解释这个场景。 我的模型类名为 FullTimeEmployee PartTimeEmployee ContractEmployee PermanentEmployee LocalEmployee 等...

我还有Helper类名为 FullTimeEmployeesHelper PartTimeEmployeesHelper ContractEmployeesHelper PermanentEmployeesHelper LocalEmployeesHelper < / strong>等...

在每个帮助程序类中,我都要定义一个接受相应模型类的方法,各个雇员的列表,一个int和一个字符串。返回类型也是员工列表。

例如 FullTimeEmployeesHelper 中的方法看起来像

public static List<FullTimeEmployee> UpdateState(List<FullTimeEmployee> employeesList, FullTimeEmployee employee, int newValue, string propertyToBeUpdated) { }

,PartTimeEmployeesHelper中的方法看起来像

public static List<PartTimeEmployee> UpdateState(List<PartTimeEmployee> employeesList, PartTimeEmployee employee, int newValue, string propertyToBeUpdated) { }

我想定义一个方法并从每个辅助类调用它,因为在方法内部完成的所有工作都是相同的,只是数据模型不同。我尝试过使用Interface IEmployee,但它没有用。使用抽象类Employee也不起作用。我面临的主要问题是所有数据模型都有不同的属性。对于所有数据模型,甚至没有一个属性是常见的。我传入的字符串是要更新的属性的名称。该方法在数据模型中查找属性,并将其更改为以int形式传递的newValue。

有没有办法减少代码重复,只使用可以从所有助手调用的方法?

1 个答案:

答案 0 :(得分:1)

您可以使用组合或IEmployee和Generics。我没有看到你想如何使用更新的属性示例,所以我创建了自己的实现。在下面的代码中,我更新了传递给方法的员工的属性。然后我将其添加到原始列表并返回。

       public static List<IEmployee> UpdateState<T>(List<T> employeesList, T employee, int newValue, string propertyToBeUpdated) where T : IEmployee
    {
        T myObject = employee;

        PropertyInfo propInfo = myObject.GetType().GetProperty(propertyToBeUpdated);

        propInfo.SetValue(employee, Convert.ChangeType(newValue, propInfo.PropertyType), null);

        employeesList.Insert(employeesList.Count, myObject);

        return ((IEnumerable<IEmployee>)employeesList).ToList();

    }

IEmployee类:

    public class IEmployee
{

    public string FirstName { get; set; }
}

PartTime / FullTimeEmployee:

    public class PartTimeEmployee : IEmployee
{
    public int PartTimeOnly { get; set; }
}

    public class FullTimeEmployee : IEmployee
{
    public int FullTimeOnly { get; set; }
}

主程序:

        static void Main(string[] args)
    {
        var newList = EmployeeHelper.UpdateState(new List<FullTimeEmployee>() { new FullTimeEmployee() { FirstName = "Ryan1", FullTimeOnly = 1 } }, new FullTimeEmployee() { FirstName = "Ryan2", FullTimeOnly = 2 }, 9, "FullTimeOnly");

        var newList2 = EmployeeHelper.UpdateState(new List<PartTimeEmployee>() { new PartTimeEmployee() { FirstName = "Roy1" } }, new PartTimeEmployee() { FirstName = "Roy", PartTimeOnly = 6 }, 2, "PartTimeOnly");
    }

希望您可以根据自己的需要调整此实施方案。有任何问题让我知道。

其他信息Covariance and Contravariance in Generics