首页 > 解决方案 > 在不同的类上使用相同的方法

问题描述

我创建了一种将 SQLite 数据库的数据分为 3 类的方法:

这段代码的问题是我只能在一个类上使用它。如果我想要第二堂课,那么我必须再次写下相同的代码并稍作改动。我现在有 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 处)是第三方代码,它使用反射比较同一类的两个对象。

标签: c#databaselambda

解决方案


在不同的类上使用一种方法的最好方法是使用通用方法。由于类不同,它们应该符合通用接口,例如 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


推荐阅读