如何在c#中构建通用方法以查询给定Azure表中的分区

Nei*_*ham 5 c# generics azure azure-table-storage

我正在尝试构建一个泛型方法来返回给定Azure表中的分区中的条目.这是它的样子:

public class Table : ITable
    {
        private CloudStorageAccount storageAccount;
        public Table()
        {
            var storageAccountSettings = ConfigurationManager.ConnectionStrings["AzureWebJobsStorage"].ToString();
            storageAccount = CloudStorageAccount.Parse(storageAccountSettings);
        }

        public async Task<IEnumerable<T>> RetrieveAllInPartition<T>(string tableReference, string partitionKey) where T : ITableEntity
        {
            var tableClient = storageAccount.CreateCloudTableClient();
            var table = tableClient.GetTableReference(tableReference);
            var query = new TableQuery<T>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey));
            var results = await table.ExecuteQuerySegmentedAsync<T>(query,null);
            return results;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这不编译我得到:

CS0310'T'必须是具有公共无参数构造函数的非抽象类型,以便在泛型类型或方法
'CloudTable.ExecuteQuerySegmentedAsync(TableQuery,TableContinuationToken)'中将其用作参数'TElement '

我有什么想法可以解决这个问题?

tor*_*vin 15

您需要为new()通用参数添加约束:

public async Task<IEnumerable<T>> RetrieveAllInPartition<T>(string tableReference, string partitionKey) 
    where T : ITableEntity, new()
Run Code Online (Sandbox Code Playgroud)

既然ExecuteQuerySegmentedAsync也有这种约束(可以在文档中看到).

此约束是必需的ExecuteQuerySegmentedAsync,否则它将无法T为您创建实例.请参阅文档以阅读有关new()约束的更多信息.