我可以让这个方法更通用/更小吗?(干)
本文关键字:方法 我可以 | 更新日期: 2023-09-27 17:51:08
我已经定义了名称为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
更新:目前,我正在使用这两个列表来检查我是否有最新的任务/人员从缓存或从服务器检索它们。我可以从服务器检索任务/人员的时间戳。我只检索完整的数据,如果我没有或我有过时的数据在缓存
您可以创建一个静态类来保存您的项,并使编译器确定使用哪一个。这将使您的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查询作为字符串?不酷。