我已经看过很多关于如何在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和反射的人的例子,有点类似于此,但我似乎无法弄明白。如果你可以通过它我,我将不胜感激。
答案 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);