public async Task LoadObjectsCacheAsync<T>(params T[] objs) where T : new(), IStoreableObject
{
using (var con = new SqlConnection(_connectionString))
{
await con.OpenAsync().ConfigureAwait(false);
foreach (var obj in objs)
{
if (await SendScalarAsync<int>($"SELECT COUNT(Id) From {obj.TableName};", con).ConfigureAwait(false) != 0)
{
var ids = YieldData<ulong>($"SELECT Id FROM {obj.TableName};", con).ToImmutableArray();
foreach (var id in ids)
{
var newObj = await LoadObjectAsync(new T() { Id = id }).ConfigureAwait(false);
if (!Cache.ContainsKey(newObj.Id)) Cache.TryAdd(newObj.Id, newObj);
else Cache[newObj.Id] = newObj;
}
}
}
}
}
Ну, проблема в том, что я не могу добавить несколько объектов, например:
await LoadObjectsCacheAsync(new Foo());
await LoadObjectsCacheAsync(new Bar());
Работает, но ...
IStoreableObject[] objs = {new Foo(), new Bar()};
await LoadObjectsCacheAsync(objs);
Не работаетt
Error CS0310 'IStoreableObject' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'T' in the generic type or method 'SQLExpressClient.LoadObjectsCacheAsync<T>(params T[])'
Это будет работать только в том случае, если я уберу ограничение new
для метода, но оно мне понадобится для кеша, в противном случае все объекты, добавленные в кеш, будут ссылаться на один и тот же объект (уже протестированный ине работает для того, что он должен делать), Кто-нибудь есть идеи, как я могу это исправить?Я попытался прочитать 2 вопроса, связанных с этим, но ни один из них не имел ответа, который мне был нужен.Я также попытался создать фиктивную структуру, чтобы избавиться от ограничения new
, но он не работает должным образом, так как метод LoadObjectAsync
будет загружать только Id и Name структуры, свойства объекта не загружаются, поскольку онине существует в фиктивной структуре.Я буду признателен за любую помощь