Azure Table Storage - универсальная загрузка для любого типа, расширяющая ITableEntity - PullRequest
0 голосов
/ 08 октября 2018

У меня есть четыре пользовательских типа данных, каждый из которых расширяет 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));
}

Я пробовал это с TableEntityи ITableEntity, но я продолжаю получать ошибки.Для TableEntity моя ошибка в том, что не существует приведение к тому типу, который мне действительно нужен (когда я вызываю метод DownloadAnyEntity), тогда как я чувствую, что это должно быть неявным, так как это расширение ITableEntity.

Для ITableEntity я получаю ошибку, что ExecuteQuery ввод должен быть неабстрактного типа с открытым конструктором без параметров.Все мои четыре пользовательских типа имеют открытые конструкторы без параметров.

Мне кажется, что проблема, которую я вижу, связана не с полным пониманием наследования, а с тем, что оно зависит от хранилища таблиц Azure.Любые указатели высоко ценится.

Я в основном следовал этой документации , но нет примера для способа загрузки сущностей, не зависящих от типа.

1 Ответ

0 голосов
/ 08 октября 2018

Вы можете сделать метод 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метод требует пустого конструктора для создания сущностей )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...