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

时间:2015-05-30 08:34:28

标签: c# generics

我已经定义了名为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

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

1 个答案:

答案 0 :(得分:2)

您可以创建一个静态类来保存您的项目,并使编译器找出要使用的项目。这将使您的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查询作为字符串?不酷。