我正在尝试实现ITableEntity
接口,以便我可以在其上添加[DataContract]
属性。但是,如果我自己实现此界面,则必须将ReadEntity
和WriteEntity
方法设为正文。
但是有一个类已经实现了ITableEntity
接口,并为ReadEntity
和WriteEntity
方法提供了一个正文TableEntity.cs。
如何使用TableEntity
类中的方法实现接口的实现?
[编辑]
[DataContract]
public class SerializableTableEntity : ITableEntity
{
private TableEntity tableEntity;
public string ETag { get; set; }
public string PartitionKey { get; set; }
public string RowKey { get; set; }
public DateTimeOffset Timestamp { get; set; }
public SerializableTableEntity()
{
tableEntity = new TableEntity();
}
public void ReadEntity(IDictionary<string, EntityProperty> properties, Microsoft.WindowsAzure.Storage.OperationContext operationContext)
{
tableEntity.ReadEntity(properties, operationContext);
}
public IDictionary<string, EntityProperty> WriteEntity(Microsoft.WindowsAzure.Storage.OperationContext operationContext)
{
return tableEntity.WriteEntity(operationContext);
}
}
答案 0 :(得分:3)
存储表中的每个属性都是空白的原因是WriteEntity和ReadEntity使用空白对象来存储和写入数据。
您将对象的序列化委托给'tableEntity',但没有任何属性存在。
建议:您需要在从TableEntity派生的类中实现所有SerializableTableEntity属性,在SerializableTableEntity实体中包含该类型的变量,并将每个成员的属性get / set从SerializableTableEntity委托给此新对象。 / p>
这有意义吗?
编辑:代码样本按要求提供(尽管你不会喜欢它)
[DataContract]
public class SerializableTableEntity : ITableEntity
{
private CustomEntity tableEntity;
public string ETag {
{
get
{
return tableEntity.ETag;
}
set
{
tableEntity.Etag = value;
}
}
public string PartitionKey
{
get
{
return tableEntity.PartitionKey;
}
set
{
tableEntity.PartitionKey = value;
}
}
public string RowKey
{
get
{
return tableEntity.RowKey;
}
set
{
tableEntity.RowKey = value;
}
}
public DateTimeOffset Timestamp
{
get
{
return tableEntity.Timestamp;
}
set
{
tableEntity.Timestamp = value;
}
}
public string PropertyOne
{
get
{
return tableEntity.PropertyOne;
}
set
{
tableEntity.PropertyOne = value;
}
}
public SerializableTableEntity()
{
tableEntity = new CustomEntity();
}
public void ReadEntity(IDictionary<string, EntityProperty> properties, Microsoft.WindowsAzure.Storage.OperationContext operationContext)
{
tableEntity.ReadEntity(properties, operationContext);
}
public IDictionary<string, EntityProperty> WriteEntity(Microsoft.WindowsAzure.Storage.OperationContext operationContext)
{
return tableEntity.WriteEntity(operationContext);
}
}
public class CustomEntity : TableEntity
{
public string PropertyOne { get; set; }
}
答案 1 :(得分:1)
我最终创建了这些类的精确副本,并使它们成为Serializable
。但是能够做一些复杂的查询似乎也是一个挑战。所以我们搬到了SQL
数据库。
答案 2 :(得分:0)
委托“不感兴趣”的方法(一个更现实的例子是here):
class YourClass : Interface {
public void ReadEntity()
{
delegateTo.ReadEntity();
}
TableEntity delegateTo = new TableEntity();
}
或者只是在其中抛出一个异常(如NotImplementedException
) - 后者只有在没有调用这些方法时才适合你。
答案 3 :(得分:0)
您可以创建一个包含TableEntity类实现的类,但也可以添加所需的功能。这类似于Decorator Pattern。
[Attributes...]
public class MyTableEntity : ITableEntity {
private TableEntity decoratedTableEntity;
public void ReadEntity(args...) {
decoratedTableEntity.ReadEntity(args...);
}
}
要使解决方案更通用,请将decoratedTableEntity更改为ITableEntity。