Azure表存储-扩展ITableEntity的任何类型的常规下载

时间:2018-10-08 04:41:59

标签: c# azure azure-storage azure-table-storage

我有四种自定义数据类型,每种类型都扩展了ITableEntity,它是WindowsAzure.Storage包的一部分。

现在,我有四种从Azure表存储下载数据的方法。每个都遵循以下格式:

public List<MyCustomEntity> DownloadMyCustomEntities(string tableId)
{
    // Reference the CloudTable object
    CloudTable table = tableClient.GetTableReference(tableId);

    TableQuery<MyCustomEntity> query = new TableQuery<MyCustomEntity>();
    return new List<MyCustomEntity>(table.ExecuteQuery(query));
}

我没有为每个自定义实体类型都使用这些方法之一,而是尝试创建一个共享函数。我希望这是可能的,因为我所有的自定义类型都继承自ITableEntity

这是我尝试过的:

public List<TableEntity> DownloadAnyEntity(string tableId)
{
    // Reference the CloudTable object
    CloudTable table = tableClient.GetTableReference(tableId);

    TableQuery<TableEntity> query = new TableQuery<TableEntity>();
    return new List<TableEntity>(table.ExecuteQuery(query));
}

我已经用TableEntityITableEntity进行了尝试,但是我一直遇到错误。对于TableEntity,我的错误是我实际需要的类型不存在强制转换(当我调用DownloadAnyEntity方法时),而我认为它应该是隐式的,因为它是{{1}的扩展}。

对于ITableEntity,我得到一个错误,即ITableEntity输入必须是具有公共无参数构造函数的非抽象类型。我所有的四个自定义类型都具有公共的无参数构造函数。

我觉得我看到的问题更多是与不完全了解继承有关,更多的是与Azure表存储相关。任何指针,不胜感激。

我一直在关注this documentation,但是没有针对非特定类型实体下载方法的示例。

1 个答案:

答案 0 :(得分:2)

您可以使DownloadAnyEntity方法具有通用性,并且对类型参数有约束

public List<T> DownloadAnyEntity<T>(string tableId) where T: ITableEntity, new()
{
    // Reference the CloudTable object
    var tableRef = tableClient.GetTableReference(tableId);

    var query = new TableQuery<T>();
    return tableRef.ExecuteQuery(query).ToList();
}

然后可以为从ITableEntity继承并具有公共emtpy构造函数的任何类型调用此方法( ExecuteQuery方法需要一个空的构造方法才能创建实体