我已经定义了名为Task
和Person
的类,这些类都来自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
更新 目前我正在使用这两个列表来检查我是否有来自缓存的最新任务/人员或从服务器检索它们。我可以从服务器检索任务/人员的时间戳。如果我没有,或者我在缓存中有过时的数据,我只检索完整的数据。
答案 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查询作为字符串?不酷。