У меня есть четыре пользовательских типа данных, каждый из которых расширяет 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. Любые указатели очень ценятся.
В основном я слежу за этой документацией, но нет примера для метода загрузки объектов, не относящегося к типу.
Вы можете сделать метод 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 требует пустого конструктора для создания объектов)
tableRef.ExecuteQuery
фрагмент tableRef.ExecuteQuery
выдает мне сообщение об ошибке: «T» должен быть неабстрактного типа с открытым конструктором без параметров, чтобы использовать его в качестве параметра «TElement» в универсальном типе или методе «CloudTable». ExecuteQuery <TElement> (TableQuery <TElement>, TableRequestOptions, OperationContect) '
TableEntity
, можете ли вы попробовать использоватьDynamicTableEntity
( docs.microsoft.com/en-us/dotnet/api/… )?