我得到使用新约束的CS0310,但我需要

时间:2018-09-30 02:15:02

标签: c# .net generics constraints

In [142]: A!=0                                                                                                          
Out[142]: 
array([[ True, False,  True],
       [False,  True,  True],
       [ True,  True, False],
       [False,  True,  True]])

问题是,我实际上不能添加多个对象,例如:

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);

这仅在我删除方法上的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[])' 约束时才有效,但我需要用于缓存,否则,添加到缓存中的所有对象都将引用同一对象(已经过测试且不适用于它应该做什么),有人对我该如何解决有任何想法吗?我尝试阅读2个与此相关的问题,但没有一个得到我所需的答案。我还尝试创建一个虚拟结构来摆脱new约束,但是它不能按预期工作,因为方法new仅会加载结构的Id和Name,而对象的属性不会被加载,因为它们在虚拟结构中不存在。我将不胜感激

0 个答案:

没有答案