C# - 泛型方法 属性

C# - Method with Generic Property

我看过很多关于如何在 C# 中使用泛型对象的示例,但是我可以为静态对象提供一个泛型 属性 吗?

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

List<Providers> OldProviders
List<Providers> NewProviders

OldProviders 具有来自数据库的提供者,NewProviders 具有用户在视图中选择的提供者。如果任何旧提供者不在新提供者中,我想将它们从数据库中删除。如果任何新提供者不在旧提供者中,我想将它们添加到数据库中。简单。

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

目前我有 2 套完全相同的辅助方法(总共 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 和反射来处理与此类似的事情,但我似乎无法理解。如果你能让我通过它,那将不胜感激。

是的,使用另一个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);

并将一行更改为:

bool remove = newSelectedStaff.SingleOrDefault(n => selector(n,oldSelected))