c# - 在不同的类上使用相同的方法
问题描述
我创建了一种将 SQLite 数据库的数据分为 3 类的方法:
- 已修改(list_1 中的变量不等于 list_2 的变量)
- 已创建(list_1 中未在 list_2 中找到的变量)
已删除(list_1 中不再存在的 list_2 变量)
旁注:list_2 是 list_1 在任何修改之前的备份
这段代码的问题是我只能在一个类上使用它。如果我想要第二堂课,那么我必须再次写下相同的代码并稍作改动。我现在有 3 节课,但在未来,我可能想要更多。如果我尝试一遍又一遍地写下每一节课,那将非常耗时,所以我发布了这个问题以征求任何建议。也因为我没有找到任何使用 lambda 表达式的文章。
public class Stats
{
public int id { get; set; }
public string name { get; set; }
}
public class FactStats : Stats
{
public string tag { get; set; }
public float balance { get; set; }
public FactStats ShallowCopy()
{
return (FactStats)this.MemberwiseClone();
}
}
List<FactStats> Factions = new List<FactStats>();
List<FactStats> SavedFactions = new List<FactStats>();
void SavetoDatabase()
{
//1. Separate Data
List<FactStats> F_JoinedList = new List<FactStats>();
List<int> F_Modify = new List<int>();
List<int> F_Create = new List<int>();
List<int> F_Delete = new List<int>();
//Modified Objects
F_JoinedList = Factions.Where(n => SavedFactions.Any(o => o.id == n.id)).ToList();
foreach (FactStats f in F_JoinedList)
{
FactStats fs = SavedFactions.Single(x => x.id == f.id);
if (!f.CompareEquals(fs))
F_Modify.Add(f.id);
}
//Created Objects
foreach (FactStats f in Factions)
{
bool vane = Convert.ToBoolean(SavedFactions.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Create.Add(f.id);
}
//Deleted Objects
foreach (FactStats f in SavedFactions)
{
bool vane = Convert.ToBoolean(Factions.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Delete.Add(f.id);
}
...
}
我试图通过反思来做到这一点,但没有多大成功。可能是因为我缺乏经验。
CompareEquals扩展方法(在 Modified Objects 处)是第三方代码,它使用反射比较同一类的两个对象。
解决方案
在不同的类上使用一种方法的最好方法是使用通用方法。由于类不同,它们应该符合通用接口,例如 IUniqueIdentifiable 应该具有“id”属性。您需要创建方法:
void Save<T>(List<T> saved, List<T> modified) where T: IUniqueIdentifiable
{
List<T> F_JoinedList = new List<T>();
List<int> F_Modify = new List<int>();
List<int> F_Create = new List<int>();
List<int> F_Delete = new List<int>();
//Modified Objects
F_JoinedList = modified.Where(n => saved.Any(o => o.id == n.id)).ToList();
foreach (T f in F_JoinedList)
{
T fs = saved.Single(x => x.id == f.id);
if (!f.CompareEquals(fs))
F_Modify.Add(f.id);
}
//Created Objects
foreach (T f in modified)
{
bool vane = Convert.ToBoolean(saved.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Create.Add(f.id);
}
//Deleted Objects
foreach (T f in saved)
{
bool vane = Convert.ToBoolean(modified.Where(f2 => f2.id == f.id).Count());
if (!vane)
F_Delete.Add(f.id);
}
...
}
public interface IUniqueIdentifiable
{
id {get;}
}
有大量文章如何创建通用方法,您可以在下面找到一个示例 http://www.informit.com/articles/article.aspx?p=605369&seqNum=4
推荐阅读
- c# - 为什么我们在 CQRS 的域对象中将属性集设置为私有
- python - 将列表与常见元素结合起来
- android - 用于数据绑定的自定义 onClickListener
- angular - 为什么 Visual Studio for Mac 不能打开从 SPA 模板创建的项目?
- java - 如何在 DTO 模型中实现 JsonNode 类型的字段
- c - XorShift32 是如何工作的?
- c - 最接近的四点对c程序
- javascript - JS如何返回一个城市的人口数量?
- npm - Electon 可以选择在生产构建的应用程序上加载“电子调试”
- regex - 如何修复“正则表达式中 $\ 的可能意外插值”?