我有四种自定义数据类型,每种类型都扩展了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
方法时),而我认为它应该是隐式的,因为它是{{1}的扩展}。
对于ITableEntity
,我得到一个错误,即ITableEntity
输入必须是具有公共无参数构造函数的非抽象类型。我所有的四个自定义类型都具有公共的无参数构造函数。
我觉得我看到的问题更多是与不完全了解继承有关,更多的是与Azure表存储相关。任何指针,不胜感激。
我一直在关注this documentation,但是没有针对非特定类型实体下载方法的示例。
答案 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方法需要一个空的构造方法才能创建实体)