在不同的类上使用相同的方法

时间:2018-08-20 23:33:56

标签: c# database lambda

我创建了一种将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中)是第三方代码,它使用反射比较同一类的两个对象。

1 个答案:

答案 0 :(得分:0)

在不同类上使用一种方法的最佳方法是使用泛型方法。由于类不同,因此它们应符合公共接口,例如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