我可以让这个方法更通用/更小吗?(干)

本文关键字:方法 我可以 | 更新日期: 2023-09-27 17:51:08

我已经定义了名称为TaskPerson的类,它们都是从TimeStamp派生的。我在维护他们各自的时间戳列表。如下:

    public static List<TimeStamp> PeopleTS = new List<TimeStamp>();
    public static List<TimeStamp> TasksTS = new List<TimeStamp>();

我也有一些泛型函数,如下所示。但它们有明确的检查,如if (typeof(T) == typeof(Person))

    public static bool AddObjects<T>(IEnumerable<T> Objects)
    {
        using (SQLiteTransaction mytransaction = grindDBConnection.BeginTransaction())
        {
            using (SQLiteCommand mycommand = new SQLiteCommand(grindDBConnection))
            {
                mycommand.CommandText = @"INSERT INTO [" + typeof(T).Name.Pluralize().ToLower() + "] ("
                    + CommaSeperatedColumnName<T>()
                    + ") VALUES ("
                    + ParameterizedCommaSeparatedColumnName<T>()
                    + ")";
                AddParameterstoSqlCommand<T>(mycommand.Parameters);
                foreach (T obj in Objects)
                {
                    BuildParametersofSqlCommand<T>(mycommand.Parameters, obj);
                    mycommand.ExecuteNonQuery();
                    if (typeof(T) == typeof(Person))//Can I do away with this check?
                        PeopleTS.Add((TimeStamp)(object)obj);
                    else
                        TasksTS.Add((TimeStamp)(object)obj);
                }
            }
            mytransaction.Commit();
        }
        return false;
    }

我是否可以做一些修改,以便我可以在T的基础上直接修改相应的列表?比如:

    public static List<TimeStamp> TS<Person> = new List<TimeStamp>();
    public static List<TimeStamp> TS<Task> = new List<TimeStamp>();

上面两行代码只是一个例子。它不能编译。所以我可以用TS<T>修改上面的任何列表,其中T:Person,Task。或者说我得到的是目前为止最好的解。完整的代码可在Grind/GrindClient/Grind。Common/Cache.cs

更新:目前,我正在使用这两个列表来检查我是否有最新的任务/人员从缓存或从服务器检索它们。我可以从服务器检索任务/人员的时间戳。我只检索完整的数据,如果我没有或我有过时的数据在缓存

我可以让这个方法更通用/更小吗?(干)

您可以创建一个静态类来保存您的项,并使编译器确定使用哪一个。这将使您的static List<TimeStamp>字段消失。

public static class TimeStampCollection<T> where T : TimeStamp
{
    public static List<TimeStamp> Items = new List<TimeStamp>();
}

在你的方法中:

            foreach (T obj in Objects)
            {
                BuildParametersofSqlCommand<T>(mycommand.Parameters, obj);
                mycommand.ExecuteNonQuery();
                TimeStampCollection<T>.Items.Add((TimeStamp)(object)obj);
            }

之后,当你引用PeopleTS时,你会使用TimeStampCollection<Person>.Items

老实说,你的方法的其余部分也不漂亮,你试图做的改变是我最不关心的。手工制作SQL查询作为字符串?不酷。