Я получаю CS0310 за использование нового ограничения, но оно мне нужно - PullRequest
0 голосов
/ 30 сентября 2018
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 структуры, свойства объекта не загружаются, поскольку онине существует в фиктивной структуре.Я буду признателен за любую помощь

...