C# - 具有通用属性的方法

时间:2017-05-18 16:02:47

标签: c# asp.net-mvc linq generics system.reflection

我已经看过很多关于如何在C#中使用通用对象的例子,但是我可以为静态对象提供通用属性吗?

我有两个不同的提供商列表:

List<Providers> OldProviders
List<Providers> NewProviders

OldProviders拥有数据库中的提供程序,NewProviders拥有用户在View中选择的提供程序。如果任何OldProviders不在NewProviders中,我想从数据库中删除它们。如果OldProviders中没有任何NewProviders,我想将它们添加到数据库中。简单。

一个问题: Provider有2个属性,对应于对比较重要的外键:StaffID和LicenseID(都是整数) 根据用户的选择,我只关心其中一个ID。

目前我有两组完全相同的辅助方法(总共6个帮助程序),除了它们是否使用StaffID或LicenseID进行比较。它在技术上有效,但我不想维护它。

以下是一个例子:

private bool DeleteOldStaffProviders(List<Provider> oldSelectedStaff, List<Provider> newSelectedStaff)
        {
            foreach (var oldSelected in oldSelectedStaff)
            {
                bool remove = newSelectedStaff.SingleOrDefault(n => n.StaffID == oldSelected.StaffID) == null;
                if (remove)
                {
                    //<remove from database, return false if failure>
                }
            }
            return true;
        }

有没有办法可以用泛型参数引用重写这个方法? 即

newSelectedStaff.SingleOrDefault(n => n.T == oldSelected.T) 

其中T是LicenseID或StaffID。

我已经看过许多使用LINQ和反射的人的例子,有点类似于此,但我似乎无法弄明白。如果你可以通过它我,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

是的,使用int[]类型的另一个参数作为选择器:

Func<Provider,int>

使用

private bool DeleteOldStaffProviders(List<Provider> oldSelectedStaff, List<Provider> newSelectedStaff, Func<Provider,Provider,bool> selector)
{
    foreach (var oldSelected in oldSelectedStaff)
    {
        bool remove = newSelectedStaff.SingleOrDefault(n => selector(n) == selector(oldSelected)) == null;
        if (remove)
        {
            //<remove from database, return false if failure>
        }
    }
    return true;
}

你可以采取另一种方式 - 但我认为它更笨重。像这样传递DeleteOldStaffProviders(oldStaff, newStaff, x => x.StaffID); DeleteOldStaffProviders(oldStaff, newStaff, x => x.LicenseID);

Func<Provider,Provider,bool>

并将一行更改为:

DeleteOldStaffProviders(oldStaff, newStaff, (o,n) => o.StaffID == n.StaffID);